effective stl:如果确实需要删除元素,则需要在remove这一类算法之后调用erase

原创 2014年10月28日 13:22:41

1. remove的声明:

template<typename ForwardIterator, typename T>
ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T &value); //value表示要删除的值

2. 要想从容器中删除元素,唯一的办法就是调用容器的成员函数,几乎总是erase的某种形式(list有几个可以删除元素的成员函数,但它们没有被命名为erase,不过它们确实是成员函数)。而remove并不知道它操作的元素所在的容器,所以remove不可能从容器中删除元素。这也说明:用remove从容器中删除元素,而容器中的元素数目却不会因此而减少。

	vector<int> v;
	v.reserve(5);
	
	for(int i=0; i<5; i++)
		v.push_back(i);
	v[0] = v[3] = 99;
	<span style="color:#ff0000;">remove(v.begin(), v.end(), 99);</span>
	cout<<v.size()<<endl;   //5

	for(i=0; i<5; i++)
		cout<<v[i]<<endl;   //1,2,4,99,4

3. 简而言之,remove移动了区间中的元素,其结果是,“不用被删除”的元素移到了区间的前部(保持原来的相对顺序)。它返回的一个迭代器指向最后一个“不用被伤处的元素之后的元素”。这个返回值相当于该区间“新的逻辑结尾end()”。
vector<int>::iterator newEnd(<span style="font-family: Arial, Helvetica, sans-serif;">remove(v.begin(), v.end(),99)</span>);
4. 如果你真想删掉这些元素:那就必须在remove之后使用erase

v.erase(remove(v.begin(), v.end(),99), v.end());  //这个时候size就变了
5. 事实上remove和erase的配合是如此紧密,以至他们被合并起来融入到了list的remove成员函数中。这是stl中唯一一个名为remove并且确实删除了容器中元素的函数(其他都是erase函数);

list<int> li;
...
li.remove(99);




effective stl 第32条:如果确实需要删除元素,则需要在remove之后调用erase

remove并不是真正意义上删除,因为它做不到。remove不知道所操作的元素在哪个容器中,如果不知道,remove就不可能调用它的成员函数。#include #include #includeusi...
  • u014110320
  • u014110320
  • 2016-09-25 21:43:42
  • 215

Effective STL 读书笔记之慎重选择删除容器元素的方法

概要:
  • wang_810
  • wang_810
  • 2014-08-12 00:06:02
  • 446

STL容器中元素的删除erase()、remove()

1.引言        以下代码有什么问题,如何修改? [cpp] view plaincopy #include   #include   us...
  • xw20084898
  • xw20084898
  • 2014-06-25 20:24:37
  • 1252

C++ STL 中 remove 和 erase 的区别

C++ STL中的remove和erase函数曾经让我迷惑,同样都是删除,两者有什么区别呢? vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vecto...
  • sfengsheng
  • sfengsheng
  • 2013-09-10 17:11:36
  • 3807

STL容器之删除元素,迭代器失效

转自博客:http://blog.csdn.net/panpanloveruth/article/details/7018549 一. 种类: 标准STL序列容器:vector、string、...
  • qq_34446253
  • qq_34446253
  • 2016-08-31 22:33:36
  • 687

C++进修之STL(一)—— erase和remove特异行动

C++进修之STL(一)—— erase和remove特异行动 2011年8月16日联系商易上海电子商务网站建设,了解更多   C++的STL...
  • jfkidear
  • jfkidear
  • 2014-08-29 17:00:09
  • 3373

vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?

vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次? 分类: C++2011-08-18 14:55 720人阅读 评论(0) 收藏 举报 vectorit...
  • jfkidear
  • jfkidear
  • 2014-11-05 13:54:20
  • 1059

C++/STL用erase删除元素(vector,deque),(list,set,map)

STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时...
  • u010003835
  • u010003835
  • 2015-08-11 20:25:35
  • 2816

remove/remove_if算法配合容器的erase方法实现容器删除元素功能

remove   算法描述:查找的得到第一个元素的位置,然后从此位置开始遍历容器,将后面的元素依次前移,跳过和value相同值的元素,也就是说,所有和value相同值的元素都会被覆盖,而其他的元素都会...
  • ClamReason
  • ClamReason
  • 2013-11-28 19:19:57
  • 1596

vector中的删除,erase和remove的小疑惑--【STL】

对于vector容器的使用,平时只是简单的进行遍历查找一下,未曾进行其它操作,这不,今天出了一点差错; earse方法的操作是将此时的节点删除,然后指向被删除节点的下一个: 如对数据1 6 6 4 7...
  • xjm199
  • xjm199
  • 2014-05-01 14:29:00
  • 2345
收藏助手
不良信息举报
您举报文章:effective stl:如果确实需要删除元素,则需要在remove这一类算法之后调用erase
举报原因:
原因补充:

(最多只允许输入30个字)