remove并不真正从容器中删除那些元素(也就说,容器大小并没有改变),而是将每一个不等于value的元素依次赋值给first之后的空间。返回值ForwardIterator 标示出重新整理后的最后一个元素的下一个位置。如果要删除那些残余的数据,可以讲返回的迭代器交给区间所在容器的erase成员函数。


STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
例子如下:

  1. #include <iostream>

  2. #include <vector>

  3. #include <algorithm>

  4. #include <functional>

  5. usingnamespace std;  

  6. int main()  

  7. {  

  8.    vector<int> Numbers;   //vector containing numbers

  9.    Numbers.push_back(10);  

  10.    Numbers.push_back(20);  

  11.    Numbers.push_back(10);  

  12.    Numbers.push_back(15);  

  13.    Numbers.push_back(12);  

  14.    Numbers.push_back(7);  

  15.    Numbers.push_back(9);  

  16.    vector<int>::iterator  it;  

  17.    cout << "Before calling remove" << endl << "Numbers { " ;  

  18. for(it = Numbers.begin(); it != Numbers.end(); it++)  

  19.    {  

  20.        cout << *it << "\t" ;  

  21.    }  

  22.    cout << " }\n" << endl ;  

  23. // remove all elements from Numbers that match 10

  24.    vector<int>::iterator ret = remove(Numbers.begin(), Numbers.end(), 10) ;  

  25.    cout << "After calling remove" << endl<< "Numbers { " ;  

  26. for(it = Numbers.begin(); it != Numbers.end(); it++)  

  27.    {  

  28.        cout << *it << "\t" ;  

  29.    }  

  30.    cout << " }\n" << endl ;  

  31.    cout << "Total number of elements removed from Numbers = "

  32.        << Numbers.end() - ret << endl ;  

  33.    cout << "Valid elements of Numbers { " ;  

  34. for(it = Numbers.begin(); it != ret; it++)  

  35.    {  

  36.        cout << *it << "\t" ;  

  37.    }  

  38.    cout << " }\n" << endl ;  

  39. }  

7859330

1344865438_3678.jpg
我们可以看出:

对于原vector { 10 20 10 15 12 7 9 },删除10,会将10后面的元素移动到前面
(注意以下逐个元素对齐,模拟元素在内存中的位置,这样就容易看出变化规律)
原vector
10 20 10 15 12 7 9
遇到第一个10,数组变成
20      10 15 12 7 9
遇到第二个10移动到7 9之后又遇到第三个10于是剩下内存中未移动的 7 9
20 15 12  7   9   7 9
遇到第三个10
20 15 12  7   9   7 9
因此,remove()需要和erase()配合使用
svec.erase(remove(svec.begin(),svec.end(),"be"), svec.end());
这句的意思是,取得"be"的位置(位于结尾),然后删除"be"到原vector结尾的所有元素


  1. iterator的使用陷阱:  

  2. vector<int> veci;  

  3. veci.push_back(1);  

  4. veci.push_back(2);  

  5. veci.push_back(3);  

  6. veci.push_back(4);  

  7. veci.push_back(5);  

  8. veci.push_back(3);  

  9. veci.push_back(2);  

  10. veci.push_back(3);  

  11. for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)  

  12. {  

  13. if( *iter == 3)  

  14.             veci.erase(iter);  

  15. }  


这样使用是错误的,因为earase结束后,iter变成了野指针,iter++就产生了错误。
erase()返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

  1. for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)  

  2. {  

  3. if( *iter == 3)  

  4.             iter = veci.erase(iter);  

  5. }  


这样无法删除连续两个3.
需要写成

  1. for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )  

  2. {  

  3. if( *iter == 3)  

  4.          iter = veci.erase(iter);  

  5. else

  6.            iter ++ ;  

  7. }