1.
int main ()
{
std::map<char,int> mymap;
mymap['a'] = 100;
mymap['b'] = 200;
mymap['c'] = 300;
mymap['d'] = 400;
mymap['e'] = 500;
mymap['f'] = 600;
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); it++) {
if ( it->first == 'b' ) {
std::cout << "erase b" << endl;
mymap.erase ( 'b' );
}
}
return 0;
}
it这个iterator已经失效了,针对这种错误就不再具体解释了
2.为了方便直接这样删除了元素,发现也能正常运行,也没去关注,最近才发现这样做是不可取的,看下面的情况:
int main ()
{
std::map<char,int> mymap;
mymap['a'] = 100;
mymap['b'] = 200;
mymap['c'] = 300;
mymap['d'] = 400;
mymap['e'] = 500;
mymap['f'] = 600;
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); it++) {
std::cout << it->first << " => " << it->second << endl;
if ( it->first == 'b' ) {
std::cout << "erase b" << endl;
mymap.erase ( 'b' );
}
std::cout << "----------------------" << endl;
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it) {
std::cout << it->first << " => " << it->second << endl;
}
}
return 0;
}
发现跳过了c,这是为什么?
原因:我们假设迭代器有6个位置0,1,2,3,4,5,对应a,b,c,d,e,f, 当删除b后 ,内容变成了0,1,2,3,4 对应a,c,d,e,f, 迭代器位置为2 ,2的位置对应了d,跳过了c
正确用法:
int main ()
{
std::map<char,int> mymap;
mymap['a'] = 100;
mymap['b'] = 200;
mymap['c'] = 300;
mymap['d'] = 400;
mymap['e'] = 500;
mymap['f'] = 600;
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ) {
std::cout << it->first << " => " << it->second << endl;
if ( it->first == 'b' ) {
std::cout << "erase b" << endl;
mymap.erase ( it++ );
}
else {
it++;
}
}
std::cout << "----------------------" << endl;
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it) {
std::cout << it->first << " => " << it->second << endl;
}
return 0;
}
结果:
诶,万事都不能偷懒啊, 一偷懒就给自己挖坑