Remove实践之一

Remove方法用于从一个序列中移除指定的元素,下面的例子可能会出现意想不到的结果:

有人可能会想象结果如下:

pre: 6 5 4 3 2 1 1 2 3 4 5 6

pos: 6 5 4 2 1 1 2 4 5 6

但是实际结果为:

pre: 6 5 4 3 2 1 1 2 3 4 5 6

pos: 6 5 4 2 1 1 2 4 5 6 5 6

所以,remove并没有改变coll的元素个数。

coll.end()返回的还是原来的end,因此size()返回的也还是原来的元素个数。但是remove还是改变了一些东西:元素顺序变了就如同值为3的元素被删除了,实际上每个值为3的元素都被它的下一个元素覆盖(overwritten)了。在集合的末尾,没有被算法覆盖的旧的元素保持不变。逻辑上,这些元素已经不在属于这个集合了。

然而,remove实际上返回了新的end,使用它,我们可以访问实际的结果区间--缩小集合的大小,或者处理被删除元素的个数。比如:

输出结果:

Pre: 6 5 4 3 2 1 1 2 3 4 5 6
Pos: 6 5 4 2 1 1 2 4 5 6
number of removed elements: 2
6 5 4 2 1 1 2 4 5 6
那为什么remove内部不去调用erase()呢?这个问题恰好凸显了STL灵活性的价值。STL通过使用iterators作为接口分离了数据结构和算法。但是iterators是一种抽象的东西用于表示容器中的位置。一般来讲,iterators不知道他们的容器。所以,通过iterators去访问容器中元素的算法也不知道任何关于容器特定的成员函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值