- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0 |
if ( *iter % 2 == 0 )
lst.erase(iter);
std::copy(lst.begin(), lst.end(),
std::ostream_iterator<int>(std::cout, " "));
}
当 iter 被 erase 掉的时候,它已经失效,而后面却还会做 ++iter ,其行为无可预期!如果你不想动用 remove_if ,那么唯一的选择就是:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <list>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::list<int> lst(arr, arr + 10);
for ( std::list<int>::iterator iter = lst.begin();
iter != lst.end(); )
if ( *iter % 2 == 0 )
lst.erase(iter++);
else
++iter;
std::copy(lst.begin(), lst.end(),
std::ostream_iterator<int>(std::cout, " "));
}
但是上面的代码不能用于 vector, string 和 deque ,因为对于这些容器, erase 不光令 iter 失效,还令 iter 之后的所有 iterator 失效!
-------------------------------------------------------------------------
erase(remove...) 惯用手法
上面的循环如此难写,如此不通用,如此不容易理解,还是用 STL 算法来的好,但是注意,光 remove_if 是没用的,必须使用 erase(remove...) 惯用手法:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <list>
#include <functional>
#include <boost/bind.hpp>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::list<int> lst(arr, arr + 10);
lst.erase(remove_if(lst.begin(), lst.end(),
boost::bind(std::modulus<int>(), _1, 2) == 0),
lst.end()
);
std::copy(lst.begin(), lst.end(),
std::ostream_iterator<int>(std::cout, " "));
}
当然,这里借助了 boost.bind ,让我们不用多写一个没用的 functor 。
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |