王骏的BLOG
编程、网络技术点滴...
<2005年2月>
303112345
6789101112
13141516171819
20212223242526
272812345
6789101112
公告

留言簿(24)

随笔分类

随笔档案

文章分类

文章档案

相册

WEB开发

相关链接

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-61 文章-5 评论-247 Trackbacks-0
list<int> mylist;
mylist.push_back(
1);
mylist.push_back(
2);
mylist.push_back(
3);
mylist.push_back(
1);
mylist.push_back(
2);

// 删除元素2

// 方式一

mylist.remove(
2);

// 方式二

mylist.erase(remove_if(mylist.begin(), mylist.end(), not1(bind2nd(modulus
<int>(), 2))), mylist.end());

// 方式三

list
<int>::iterator Iter;
list<int>::iterator EndIter = mylist.end();
for(Iter = mylist.begin(); Iter != EndIter; )
    
{
        
if(*Iter == 2)
            Iter = mylist.erase(Iter);

        
else
            Iter
++;
    }


打印出结果
list<int>::iterator Iter;
list<int>::iterator EndIter = mylist.end();
for(Iter = mylist.begin(); Iter != EndIter; Iter++)
{
    cout 
<< *Iter << endl;
}

三种方式的速度比(数值越小速度越快)
1 : 1.63 : 1.17
注:这里的速度比较是简单的、粗糙的比较。
posted on 2005-02-20 22:23 王骏的BLOG 阅读(4185) 评论(10)  编辑 收藏
Comments
  • # re: [烂笔头备忘录] 删除list元素
    周星星
    Posted @ 2005-02-21 09:14
    看完,不错!
    第一种方法给出了最正宗的做法
    第二种方法暗示了remove_if用于list容器的注意点
    第三种方法暗示了容器迭代时erase时的注意点
  • # re: [烂笔头备忘录] 删除list元素
    wangjun
    Posted @ 2005-02-21 09:42
    :-) 我常用到第三种方式,因为有时是list<CXXX *>::iterator Iter;
    还需要对*Iter做点啥,例如
    (*Iter)->OnBeforeDelete();
    delete *Iter;
  • # re: [烂笔头备忘录] 删除list元素
    周星星
    Posted @ 2005-02-21 09:57
    第三种方法确实功能最强大,虽然正宗的做法是使用std::list::remove_if(不是std::remove_if),但仿函数写起来麻烦,而且函数内部的仿函数不能用于模板,写在函数外部又导致代码污染。
  • # re: [烂笔头备忘录] 删除list元素
    wangjun
    Posted @ 2005-02-21 20:17
    同感!
  • # re:
    _hpho
    Posted @ 2005-02-22 11:20
    list<int>::iterator Iter = mylist.begin();
    list<int>::iterator EndIter = mylist.end();

    for(; Iter != EndIter; ++Iter) {
        cout << *Iter << endl;
    }
  • # 第1种第3种一样吧。第二种理论上编译器是可以优化的。
    七猫的垃圾箱
    Posted @ 2005-02-22 16:02
    void remove(const _Ty& _Val)
    { // erase each element matching _Val
    iterator _Last = end();
    for (iterator _First = begin(); _First != _Last; )
    if (*_First == _Val)
    _First = erase(_First);
    else
    ++_First;
    }

    template<class _Pr1>
    void remove_if(_Pr1 _Pred)
    { // erase each element satisfying _Pr1
    iterator _Last = end();
    for (iterator _First = begin(); _First != _Last; )
    if (_Pred(*_First))
    _First = erase(_First);
    else
    ++_First;
    }
  • # re: [烂笔头备忘录] 删除list元素
    王骏的BLOG
    Posted @ 2005-02-22 18:40
    谢谢各位,方式三现在看起来舒服多了。
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]