为什么以下代码的输出为b 0
:
int main ()
{
std::map<char,int> mymap;
std::map<char,int>::iterator it;
mymap['a']=10;
mymap['b']=20;
mymap['c']=30;
mymap['d']=40;
mymap['e']=50;
mymap['f']=60;
it=mymap.find('b');
mymap.erase (it); // erasing by iterator
std::cout << it->first << " " << it->second << std::endl;
mymap.erase ('c'); // erasing by key
it=mymap.find ('e');
mymap.erase ( it, mymap.end() ); // erasing by range
// show content:
for (it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
return 0;
}
答案 0 :(得分:0)
迭代器(it)指向mymap中的特定内存地址。一旦调用mymap.erase(it),mymap中就不再存在该内存地址,因此迭代器变为无效,在重新初始化之前不应访问它。
在你的情况下,迭代器最终返回0.然而,它可能很容易地返回3,或99,或-244242或已经使用的任何其他不同存储器。这就是为什么在它失效后永远不想访问迭代器的原因,因为它会导致未定义的行为。
it = mymap.find('b');
mymap.erase(it);
std::cout << it->first << " " << it->second << std::endl; // this is not allowed!!!
如果您需要在从mymap中删除后访问该值,则应首先将其复制到变量中。
it = mymap.find('b');
std::pair<char, int> temp = *it;
mymap.erase(it); // erasing by iterator
std::cout << temp.first << " => " << temp.second << std::endl;