如下代码,有如下疑惑:
看很多文章说如下写法(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");
如果按照很多文章说的正确方式修改如下,代码为何依然符合预期呢?
for (auto iter = tmp.begin(); iter != tmp.end(); ) { if (*iter == 5) { tmp.erase(iter); //这里没进行iter++,不是和上述1中代码矛盾吗? 但是代码结果依然符合预期。 } else { iter++; } }
当然失效了,只不过在你这段代码内没体现出来而已。
代码改成这样:
还能预期工作么? 换成这样呢