vector的erase()

erase的函数原型有两种形式:

iterator erase(iterator position);//删除单个位置

iterator erase(iterator first, iterator last);//删除一段

在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。 

删除一段段元素之后,后面的元素(从iter_end开始到vector.end())会被复制到被删除元素段开始的地方(iter_begin开始),而vector.end()也根据删除的元素个数往前移动。

总结:erase操作传入迭代器,迭代器所指位置在删除前后不发生改变,改变的只是容器中元素值。删除该元素后,被删元素后面的所有元素复制到被删元素位置上,尾部迭代器也移动到新的尾部位置。


注意事项:

对vector中的数据进行去除的时候,最好是用C++的迭代器,这样不容易出错。

vector<int> veci;
veci.push_back(1);
veci.push_back(2);
veci.push_back(3);
veci.push_back(4);
veci.push_back(5);
veci.push_back(3);
veci.push_back(2);
veci.push_back(3);

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
             veci.erase(iter);
}

问题:其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

应该改为:

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
             iter = veci.erase(iter);
}

这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
     if( *iter == 3)
          iter = veci.erase(iter);
      else
            iter ++ ;
}

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/88964976