王骏的博客
编程、网络技术点滴...

公告

逐渐将VC知识库的博客迁移到这里!

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

程序员博客   首页  新随笔  订阅  管理  登录 
 
王骏的博客 阅读(1693) 评论(7)
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
注:这里的速度比较是简单的、粗糙的比较。

评论列表
周星星
re: [烂笔头备忘录] 删除list元素
看完,不错!
第一种方法给出了最正宗的做法
第二种方法暗示了remove_if用于list容器的注意点
第三种方法暗示了容器迭代时erase时的注意点
wangjun
re: [烂笔头备忘录] 删除list元素
:-) 我常用到第三种方式,因为有时是list<CXXX *>::iterator Iter;
还需要对*Iter做点啥,例如
(*Iter)->OnBeforeDelete();
delete *Iter;
周星星
re: [烂笔头备忘录] 删除list元素
第三种方法确实功能最强大,虽然正宗的做法是使用std::list::remove_if(不是std::remove_if),但仿函数写起来麻烦,而且函数内部的仿函数不能用于模板,写在函数外部又导致代码污染。
wangjun
re: [烂笔头备忘录] 删除list元素
同感!
_hpho
re:
list<int>::iterator Iter = mylist.begin();
list<int>::iterator EndIter = mylist.end();

for(; Iter != EndIter; ++Iter) {
    cout << *Iter << endl;
}
七猫的垃圾箱
第1种第3种一样吧。第二种理论上编译器是可以优化的。
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;
}
王骏的BLOG
re: [烂笔头备忘录] 删除list元素
谢谢各位,方式三现在看起来舒服多了。

发表评论
切换编辑模式