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去访问容器中元素的算法也不知道任何关于容器特定的成员函数。