C++ vector erase()函数能否删除两个连续的相同元素?

C++ vector erase()函数能否删除两个连续的相同元素?,c++,vector,stl,duplicates,erase,C++,Vector,Stl,Duplicates,Erase,下面是我的程序片段。我遍历一个向量,并尝试删除所有 三的价值。但是在我打印了向量的内容之后,它是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)

下面是我的程序片段。我遍历一个向量,并尝试删除所有 三的价值。但是在我打印了向量的内容之后,它是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;
}

我们可以分解你的例子,只看最后三个数字3,3,5

在删除前3之后,返回一个迭代器2和第二个3

it = a.erase(it);
但在这之后,它立即以

it++;
现在指向5

在这里你可以使用。示例代码:

a.erase(std::remove(a.begin(), a.end(), 3), a.end());
在名为remove_iffirst,last,func中有一个方法可以解决您的问题。这样更安全。请检查以下代码是否被截断-

#include <iostream>
#include <vector>
#include <algorithm>
bool isThree(int k){
   return (k == 3);
}

int main(){

  std::vector<int> v {1,2,3,4,5,6,7,3,3,3};
  std::vector<int>::iterator it;
  
  v.erase(std::remove_if(v.begin(), v.end(), isThree), v.end());

  for(int i=0;i<v.size(); i++){
     std::cout << v[i] << " ";
  }

  return 0;
}

错误在于,无论何时删除一个元素,都会跳过对该元素的检查。这是因为它=a;将所有元素向后移动超过它并返回它-要解决此问题,请在删除时不增加它:

for(auto it=a.begin();it!=a.end();)
{
    if(*x == 3) it=a.erase(it); else it++;
}

此外,此代码速度较慢,因为它可能在^2操作上-最好使用std::remove,然后触发擦除/调整大小,以使向量大小正确。

在迭代容器时不要删除元素。使用函数返回您期望的迭代器吗?提示:在你的情况下,也许更好的解决办法是打电话?但你也必须了解,这是不可能的。盲增量对于考虑it=a.eraseit在列表的最后一个元素上触发,并在这样做时使其在a.end上着陆没有任何启示。如果发生这种情况,随后的无条件it++将调用未定义的行为ex:a={1,2,3,3},正如我们在您的示例中多次提到的那样。由于该问题中所述的原因,这与在循环的增量步骤中使用it++一样不可靠