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

开发 后端
删除C++容器值的实现方法还是比较多的,我们今天为大家介绍的就是其中一个比较常用的,简单的实现方法,希望能给大家带来一些帮助。

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

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

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

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

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

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

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

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

  1. list<int> c;  
  2. // todo insert items  
  3. list<int>::iterator nextitr = c.begin();  
  4. for (list<int>::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;  

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

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

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

嗯。。。高手就是高手(我以前根本没有在意过++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<int> c;  
  9. // todo insert items  
  10. c.remove_if(fun); 

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

【编辑推荐】

  1. C++ Builder操作Excel表实现技巧讲解
  2. C++指针漂移问题解决方案
  3. C++头文件包含内容概览
  4. C++初始化和赋值区别解析
  5. C++标准输入输出应用技巧解析
责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-01 15:01:34

C++抛出异常

2010-01-18 10:16:58

学习C++

2010-01-08 14:07:47

VB.NET窗体传值

2010-02-05 13:44:06

C++ eof()函数

2010-02-06 15:15:31

C++ Builder

2010-02-05 13:52:04

C++资源管理

2010-02-01 17:37:35

C++调用C链接库

2010-01-04 14:49:30

Silverlight

2009-12-30 18:18:32

Silverlight

2011-05-30 15:29:32

C++

2010-02-05 17:25:26

C++标识符命名规则

2010-01-28 16:55:26

Android对话框

2011-07-10 15:26:54

C++

2010-01-22 16:35:41

C++开发

2010-01-26 17:11:13

C++编程

2010-02-06 10:24:48

C++二维数组初始化

2010-02-03 17:42:33

C++模板参数

2010-01-25 18:26:44

CC++头文件

2011-07-13 16:36:11

C++

2010-02-01 11:13:00

C++ Traits
点赞
收藏

51CTO技术栈公众号