【发布时间】:2021-06-10 06:50:28
【问题描述】:
下面是我的程序的 sn-p。我遍历一个向量并尝试删除所有具有 三的值。但是我打印出向量的内容后,是1-2-4-3-5,还是有数字3,为什么?如果要删除两个连续相同的元素,是否需要专门处理迭代器?
int main()
{
std::vector<int> a = {1, 2, 3, 4, 3, 3, 5}; // a has size 5
for(auto it=a.begin();it!=a.end();)
{
if(*it == 3) it=a.erase(it);
it++;
}
for(auto x:a) cout<<x<<endl;
}
【问题讨论】:
-
在迭代容器时不要删除元素。使用erase-remove-idiom
-
erase函数真的会返回您期望的迭代器吗? (提示:它没有) -
而在您的情况下,也许更好的解决方案是调用
std::remove?但是你还必须了解the erase-remove idiom。 -
这是坏了。盲增量无法考虑
it=a.erase(it)在列表的最后一个 元素上触发,并因此将it降落在a.end()上。如果发生这种情况(例如:a = { 1,2,3,3 } ),随后的无条件it++将调用 未定义的行为,正如我们在您的 previous post on this code 中多次说过的那样。由于该问题中所述的原因,这与在循环的增量步骤中有it++一样被破坏
标签: c++ vector stl duplicates erase