快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

删除C++容器值相关方法是怎么样的

这期内容当中小编将会给大家带来有关删除C++容器值相关方法是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

我们提供的服务有:成都做网站、网站建设、微信公众号开发、网站优化、网站认证、旌阳ssl等。为千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的旌阳网站制作公司

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

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

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

list c;  // todo insert items  for (list::iterator i = c.begin(); i!= c.end(); ++i)  {  if ((*i)>10)  {  // 如果有一个值大于10,删除之  c.erase(i);  break;  }  }

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

list c;  // todo insert items  for (list::iterator i = c.begin(); i!= c.end(); ++i)  {  if ((*i)>10)  {  // 删除所有大于10的值  c.erase(i);  }  }

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

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

list c;  // todo insert items  list::iterator nextitr = c.begin();  for (list::iterator i = c.begin();;)  {  if(nextitr == c.end())  break;  ++nextitr;  if ((*i)>10)  {  // 如果有一个值大于10,删除之  c.erase(i);  }  i = nextitr;  }

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

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

list c;  // todo insert items  for (list::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 c;  // todo insert items  c.remove_if(fun);

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

上述就是小编为大家分享的删除C++容器值相关方法是怎么样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


本文题目:删除C++容器值相关方法是怎么样的
文章网址:http://6mz.cn/article/iigspi.html

其他资讯