shootingstars

posts(9) comments(4) trackbacks(0)
  • C++博客
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • C++(7)
  • IPC
  • PKI(1)
  • 网络(1)

随笔档案

  • 2007年7月 (3)
  • 2007年6月 (5)
  • 2006年2月 (1)

我的收藏

  • Linux,Flex,Yacc....
  • 对很多东东的理解极具深度。文章细致,由浅入深。

搜索

  •  

最新评论

  • 1. re: P2P之UDP穿透NAT的原理与实现(附源代码)
  • 测试了下, 打不通, 求指导。
  • --napt
  • 2. re: P2P之UDP穿透NAT的原理与实现(附源代码)
  • 楼主,工程页面已经没了,给以发我一份吗?谢谢
    549162261@qq.com
  • --SLINGERWANG
  • 3. re: P2P之UDP穿透NAT的原理与实现(附源代码)
  • 楼主 工程下载失败 可否提供一份学习 谢谢
    msopengl@163.com
  • --jemmyLiu
  • 4. re: 如何删除C++容器中的值
  • 评论内容较长,点击标题查看
  • --cchao

阅读排行榜

评论排行榜

View Post

如何删除C++容器中的值

C++的容器中一般都提供erase函数,此函数接收的参数一般有一个是一个迭代器:
如果删除某一个值的话,我们可能一般都用过:
list<int> c;
// todo insert items
for (list<int>::iterator i = c.begin(); i!= c.end(); ++i)
{
    
if ((*i)>10)
    {
        
// 如果有一个值大于10,删除之
        c.erase(i);
        
break;
    }
}
上述代码在删除一个元素的时候并没有问题。。。但是我们想删除所有大于10的值,于是:
list<int> c;
// todo insert items
for (list<int>::iterator i = c.begin(); i!= c.end(); ++i)
{
    
if ((*i)>10)
    {
        
// 删除所有大于10的值
        c.erase(i);
    }
}
满怀希望的编译,运行。。。于是异常发生。。。
啊。。。哦。。。
原来是删除迭代器i后,i所指的元素已经失效了,然后给i++,它已经不在存在了。。。于是绞尽脑汁,出笼了下面的代码:
list<int> c;
// todo insert items
list<int>::iterator nextitr = c.begin();
for (list<int>::iterator i = c.begin();;)
{
    
if(nextitr == c.end())
        
break;
    
++nextitr;
    
if ((*i)>10)
    {
        
// 如果有一个值大于10,删除之
        c.erase(i);
    }
    i 
= nextitr;
}
上面的代码很容易理解,即在删除一个迭代器之前,把它的之后的迭代器先存储,然后在下次循环的时候利用之前存储的迭代器。
OK,我们看到上面这段代码可以工作了,行为似乎也还正确,只是。。。代码似乎多了点。我想代码能够少点就好了,逻辑也不要那么麻烦。那么我们看下面的代码(转载自Effective STL)。
list<int> c;
// todo insert items
for (list<int>::iterator i = c.begin(); i!= c.end();)
{
    
if ((*i)>10)
    {
        
// 如果有一个值大于10,删除之
        c.erase(i++);
    }
    
else
        i
++;
}
嗯。。。高手就是高手(我以前根本没有在意过++i和i++在使用的过程中能有这么大的区别)
好了,最后再提供一个版本,利用list的remove_if函数。
bool fun(int i)
{
    
if(i>10)
        
return true;
    
else
        
return false;
}

list
<int> c;
// todo insert items
c.remove_if(fun);
嗯,其实删除一个容器中的值的方式还是挺多的。

posted on 2007-06-12 17:37 shootingstars 阅读(6649) 评论(1)  编辑 收藏 引用 所属分类: C++

View Comments

# re: 如何删除C++容器中的值  回复  更多评论   
c.erase(i++);好像不太安全,erase里面会把i给删除,在函数返回以后才会使用i自增,这时的i应该已经无效。个人觉得,用i = c.erase(i);会比较好,erase调用会把其后的迭代元素的返回。
2011-08-30 11:50 | cchao
刷新评论列表

只有注册用户登录后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
  • [导入]C++中关于类中常数静态成员初始化的问题
  • boost::regex学习
  • boost::algorithm学习
  • 是我rp不好,还是Microsoft的rp不好。。。
  • 五种迭代器
  • C++泛型算法笔记(1)
  • 如何删除C++容器中的值
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


 
Powered by:
C++博客
Copyright © shootingstars