您的位置:首页 > 编程语言 > C语言/C++

STL Vector remove()和erase()的使用

2016-03-01 10:43 549 查看
STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。

例子如下:

[cpp] view
plain copy

#include <iostream>  

#include <vector>  

#include <algorithm>  

#include <functional>  

  

using namespace std;  

  

int main()  

{  

    vector<int> Numbers;   //vector containing numbers  

  

    Numbers.push_back(10);  

    Numbers.push_back(20);  

    Numbers.push_back(10);  

    Numbers.push_back(15);  

    Numbers.push_back(12);  

    Numbers.push_back(7);  

    Numbers.push_back(9);  

  

    vector<int>::iterator  it;  

  

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

  

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

    {  

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

    }  

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

  

    // remove all elements from Numbers that match 10  

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

  

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

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

    {  

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

    }  

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

  

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

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

  

    cout << "Valid elements of Numbers { " ;  

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

    {  

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

    }  

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

  

}  





我们可以看出:
对于原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结尾的所有元素

[cpp] view
plain copy

iterator的使用陷阱:  

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);  

}  

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

[cpp] view
plain copy

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

{  

      if( *iter == 3)  

             iter = veci.erase(iter);  

}  

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

[cpp] view
plain copy

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

{  

     if( *iter == 3)  

          iter = veci.erase(iter);  

      else  

            iter ++ ;  

}  

【摘自:http://blog.csdn.net/ozwarld/article/details/7761519

/Uploads/Images/Content/201603/0b78229e88da6bc8d88ede27f3d7ff62】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++