c ++ map erase(),迭代器打印擦除元素

时间:2018-04-21 13:40:00

标签: c++ stl

为什么以下代码的输出为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;
}

1 个答案:

答案 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;