码迷,mamicode.com
首页 > 其他好文 > 详细

STL笔记(4)关于erase,remove

时间:2014-12-13 00:45:22      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:blog   http   ar   os   使用   sp   strong   on   div   

STL笔记(4)关于erase,remove

你要erase的元素很容易识别。它们是从区间的“新逻辑终点”开始持续到区间真的终点的原来区间的元素。要除去那些元素,你要做的所有事情就是用那两个迭代器调用erase的区间形式(参见条款5)。因为remove本身很方便地返回了区间新逻辑终点的迭代器,这个调用很直截了当:

bubuko.com,布布扣vector<int> v;                        // 正如从前
bubuko.com,布布扣v.erase(remove(v.begin(), v.end(), 99), v.end());        // 真的删除所有
bubuko.com,布布扣                            // 等于99的元素
bubuko.com,布布扣cout << v.size();                        // 现在返回7
bubuko.com,布布扣

把remove的返回值作为erase区间形式第一个实参传递很常见,这是个惯用法。事实上,remove和erase是亲密联盟,这两个整合到list成员函数remove中。这是STL中唯一名叫remove又能从容器中除去元素的函数:

bubuko.com,布布扣list<int> li;            // 建立一个list
bubuko.com,布布扣                // 放一些值进去
bubuko.com,布布扣li.remove(99);            // 除去所有等于99的元素:
bubuko.com,布布扣                // 真的删除元素,
bubuko.com,布布扣                // 所以它的大小可能改变了
bubuko.com,布布扣

坦白地说,调用这个remove函数是一个STL中的矛盾。在关联容器中类似的函数叫erase,list的remove也可以叫做erase。但它没有,所以我们都必须习惯它。我们所处于的世界不是所有可能中最好的世界,但却是我们所处的。(附加一点,条款44指出,对于list,调用remove成员函数比应用erase-remove惯用法更高效。)

一旦你知道了remove不能“真的”从一个容器中删除东西,和erase联合使用就变成理所当然了。你要记住的唯一其他的东西是remove不是唯一这种情况的算法。另外有两种“类似remove”的算法:remove_if和unique。

remove和remove_if之间的相似性很直截了当。所以我不会细讲,但unique行为也像remove。它用来从一个区间删除东西(邻近的重复值)而不用访问持有区间元素的容器。结果,如果你真的要从容器中删除元素,你也必须成对调用unique和erase,unique在list中也类似于remove。正像list::remove真的删除东西(而且比erase-remove惯用法高效得多)。list::unique也真的删除邻近的重复值(也比erase-unique高效)。

(译注:《C++标准程序库》111页5.6节有remove的详细解释)

STL笔记(4)关于erase,remove

标签:blog   http   ar   os   使用   sp   strong   on   div   

原文地址:http://www.cnblogs.com/x113/p/4160696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!