stl容器中的元素删除方法

STL中元素的删除方法:

问题描述:

对于容器:container<int> c;

要删除其中元素值为1的元素。container为一类容器。

1、  连续内存的容器(vector、deque或string)

采用erase-remove方法

c.erase(remove(c.begin(), c.end(), 1),c.end());

对于list而言,这一方法也适用,但方法2更有效

调用erase不仅会使指向被删除的元素迭代器无效,也会使被删除元素之后的迭代器无效,若要循环删除需要利用erase的返回值——指向紧随被删除元素之后的下一个有效迭代器。

扩展:

vector清空所有元素常用方法(deque也适用,但更常用的是clear):

vector<int> vec;

{

         vector<int>vecTemp;

         vecTemp.swap(vec);

}

注:使用clear来删除元素并不能使vector的size变为0,而对于deque来说使用clear可以使size变为0,

2、  list

list由于其插入和删除的时间是O(1)的,所以其删除也与其他容器不同,采用成员函数remove更为高效

c.remove(1);

3、  标准关联容器(set、multiset、map、multimap)

c.erase(1);

当删除容器中的元素时,指向该元素的所有迭代器都将变得无效。当循环删除时可以使用

c.erase(iter++);   //先使iter指向下个元素,再删除当前元素

p. s:不能使用remove操作(因为没有remove成员函数,而使用remove算法可能会覆盖容器的

值)

总结:

再说下几点不同:vector等非关联容器的erase和关联容器的erase返回值并不一样,前者返回指向紧随被删除元素之后的下一个有效迭代器,后者返回void。list容器比较特殊,对其进行删除,排序等操作应使用其成员函数(高效而又不会出错)。

最后推荐一下学习stl的书籍:《EffectiveSTL》Scott、《stl 源码剖析》侯捷(对stl还没入门的先找一本入门书看看)

原文地址:https://www.cnblogs.com/OpenLinux/p/5020701.html