删除C++容器值相关技巧讲解

在程序开发的过程中,C++编程语言中的容器里有会有很多值,有些是比较有用的,而有些是没用的。那么对于这些没有用的值我们应该如何进行删除呢?在这里我们将会为大家详细介绍删除C++容器值的相关方法。

C++的容器中一般都提供erase函数,此函数接收的参数一般有一个是一个迭代器:

如果删除C++容器值的话,我们可能一般都用过:

 
 
 
  1. list c;
  2. // todo insert items
  3. for (list::iterator i = c.begin(); i!= c.end(); ++i)
  4. {
  5. if ((*i)>10)
  6. {
  7. // 如果有一个值大于10,删除之
  8. c.erase(i);
  9. break;
  10. }
  11. }

上述代码在删除一个元素的时候并没有问题。。。但是我们想删除所有大于10的值,于是:

 
 
 
  1. list c;
  2. // todo insert items
  3. for (list::iterator i = c.begin(); i!= c.end(); ++i)
  4. {
  5. if ((*i)>10)
  6. {
  7. // 删除所有大于10的值
  8. c.erase(i);
  9. }
  10. }

满怀希望的编译,运行。。。于是异常发生。。。啊。。。哦。。。

原来是删除迭代器i后,i所指的元素已经失效了,然后给i++,它已经不在存在了。。。于是绞尽脑汁,出笼了下面的删除C++容器值代码:

 
 
 
  1. list c;
  2. // todo insert items
  3. list::iterator nextitr = c.begin();
  4. for (list::iterator i = c.begin();;)
  5. {
  6. if(nextitr == c.end())
  7. break;
  8. ++nextitr;
  9. if ((*i)>10)
  10. {
  11. // 如果有一个值大于10,删除之
  12. c.erase(i);
  13. }
  14. i = nextitr;
  15. }

上面的代码很容易理解,即在删除一个迭代器之前,把它的之后的迭代器先存储,然后在下次循环的时候利用之前存储的迭代器。

OK,我们看到上面这段代码可以工作了,行为似乎也还正确,只是。。。代码似乎多了点。我想代码能够少点就好了,逻辑也不要那么麻烦。那么我们看下面的代码(转载自Effective STL)。

 
 
 
  1. list c;
  2. // todo insert items
  3. for (list::iterator i = c.begin(); i!= c.end();)
  4. {
  5. if ((*i)>10)
  6. {
  7. // 如果有一个值大于10,删除之
  8. c.erase(i++);
  9. }
  10. else
  11. i++;
  12. }

嗯。。。高手就是高手(我以前根本没有在意过++i和i++在使用的过程中能有这么大的区别)好了,***再提供一个版本,利用list的remove_if函数。

 
 
 
  1. bool fun(int i)
  2. {
  3. if(i>10)
  4. return true;
  5. else
  6. return false;
  7. }
  8. list c;
  9. // todo insert items
  10. c.remove_if(fun);

嗯,其实删除C++容器值的方式还是挺多的。

当前标题:删除C++容器值相关技巧讲解
转载源于:http://www.csdahua.cn/qtweb/news43/341393.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网