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

remove并不是真正意义上删除,因为它做不到。remove不知道所操作的元素在哪个容器中,如果不知道,remove就不可能调用它的成员函数。

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int main()
{
    //因为从容器中删除元素的方法是调用该容器的成员函数,而remove不可能从容器中删除,所以
    //用remove从容器中删除元素,容器中元素的数目不会减少
    vector<int> v;
    v.reserve(10);

    for (int i = 1; i <= 10; i++)
    {
        v.push_back(i);
    }

    cout << v.size() << endl;//输出为10

    v[3] = v[5] = v[9] = 99;

    remove(v.begin(), v.end(), 99);//删除值为99的元素
    cout << v.size() << endl;//输出依然为10
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << endl;
    }

    return 0;
}

看下边的代码

    vector<int>::iterator newEnd(remove(v.begin(), v.end(), 99));

把“不用被删除”的元素放在v和v.begin()和newEnd之间,把“需要被删除”的元素放在newEnd()和v.end()之间,这看起来很符合逻辑,情况不是这样的!要被删除的元素就不应该再留在v中。remove并没改变区间中元素的顺序,它只是使用要被删除的元素放在尾部,不用被删除的元素放在前边。尽管C++标准并没有强调,但一般情况下在新的逻辑结尾后边的元素仍然保留其旧的值。

v.erase(remove(v.begin(), v.end(), 99),v.end());//真正删除所有值等于99的元素

但是在list的成员函数中,remove的功能与其余标准序列容器的remove-erase功能相同,按照理论上来说,list的remove也应该被称为erase,但是在关联容器中类似的函数仍然被叫做erase。

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

remove和remove_if的相似性是很显然的;但是unique也和remove行为也很相似。它也需要在没有任何容器信息的情况下,从容器中删除一些元素(相邻的,重复的)。所以,如果你真的想从容器中删除元素,就必须在调用erase之后再调用erase。unique与list的结合也与remove的情形相似。如同list::remove会真正删除元素,list::unique也会真正的删除元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值