vector的erase导致迭代器失效

如下代码,有如下疑惑:

  1. 看很多文章说如下写法(erase相关)会导致迭代器失效,但是测试验证发现并没失效,而且也符合预期;这是为什么呢?

     vector<int> tmp;
     for (int i = 1; i <= 10; i ++) {
         tmp.push_back(i);
     }
    
     for (auto iter = tmp.begin(); iter != tmp.end(); iter++) {
         if (*iter == 5) {
             tmp.erase(iter); //既然这里删除了当前iter指向的元素,为什么iter没失效呢?
         }
     }
     for (auto i : tmp) {
         printf("%d,", i);
     }
     printf("\n");
  2. 如果按照很多文章说的正确方式修改如下,代码为何依然符合预期呢?

     for (auto iter = tmp.begin(); iter != tmp.end(); ) {
         if (*iter == 5) {
             tmp.erase(iter); //这里没进行iter++,不是和上述1中代码矛盾吗? 但是代码结果依然符合预期。
         } else {
             iter++;
         }
     }
阅读 1.6k
1 个回答

当然失效了,只不过在你这段代码内没体现出来而已。

代码改成这样:

if (*itr == 5 || *itr == 6) erase

还能预期工作么? 换成这样呢

for (auto itr = tmp.begin(); itr != tmp.end();) {
  if (*itr == 5 || *itr == 6) {
    itr = tmp.erase(itr);
  } else {
    itr++;
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题