对C++ STL,list元素的循环删除操作

原创 2006年06月05日 23:33:00

在用iterator遍历整个list时,iterator相当于链表中的当前结点指针,如果我们在循环体中遍历整个list, 并且对满足一定条件的元素进行删除操作,一定要先保存当前要删除结点的下一个结点的iterator,否则删除完元素的下一次循环体会因为指针丢失而报错。

我们看一看以下程序:

#include "stdafx.h"
#include <list>
using namespace std;
int main()
{
 list<char> coll;
 for(char c='a'; c<='z'; ++c)
 {
  coll.push_back(c);
 }
 list<char>::iterator pos;
 for (pos=coll.begin(); pos != coll.end(); ++pos)
 {
  cout << *pos << ' ';
 }
 cout <<endl;
 for (pos=coll.begin(); pos !=coll.end(); ++pos)
 {
  if ((*pos) == 't')              //我们的本意是删除值为't'的元素,但是这样直接删除后,pos指针就悬空了,下一个循环当执行++pos时,指针会指向不可预料的位置而出现内存读写错误
  {
   coll.erase(pos);
  }
 }

  for (pos=coll.begin(); pos != coll.end(); ++pos)
 {
  cout << *pos << ' ';
 }
 cout <<endl;
 return 0;
}

我们的本意是删除值为't'的元素,但是这样直接删除后,pos指针就悬空了,下一个循环当执行++pos时,指针会指向不可预料的位置而出现内存读写错误。正确的做法是先保存pos指针,再删除,避免指针悬空。

#include "stdafx.h"
#include <list>
using namespace std;
int main()
{
 list<char> coll;
 for(char c='a'; c<='z'; ++c)
 {
  coll.push_back(c);
 }
 list<char>::iterator pos;
 for (pos=coll.begin(); pos != coll.end(); ++pos)
 {
  cout << *pos << ' ';
 }
 cout <<endl;
 for (pos=coll.begin(); pos !=coll.end(); ++pos)
 {
  if ((*pos) == 't')
  {
   list<char>::iterator pos2;        //用pos2来保存pos指针
   pos2=pos;
   pos++;
   coll.erase(pos2);
  }
 }

 for (pos=coll.begin(); pos != coll.end(); ++pos)
 {
  cout << *pos << ' ';
 }
 cout <<endl;
 return 0;
}


相关文章推荐

STL容器中 存放指针与对象区别 遍历删除与释放操作

c++中我相信大家经常要用到STL里面的各种容器来存放自己的数据,既然我们用的这么频繁那么就相应该有一些疑问?...

c++中List在遍历时删除节点的方法,带源码

今天在开发的过程中遇到问题,想要遍历一个List中的节点,满足一定条件则删除该节点,但是由于使用的是iterator就会出现错误,最后找到解决方法,并写了一个测试程序,呵呵: // ListTes...
  • sonikk
  • sonikk
  • 2012年08月15日 19:19
  • 16557

C++/STL_利用remove_if 删除vector,list,deque满足条件的元素

#include forward_iterator remove_if( forward_iterator start, forward_iterator end, Predicate p ...

正确在遍历中删除List元素

最近在写代码的时候遇到了遍历时删除List元素的问题,在此写一篇博客记录一下。 一般而言,遍历List元素有以下三种方式: 使用普通for循环遍历 使用增强型for循环遍历 使用iterator遍历...

如何正确遍历删除List中的元素,你会吗?

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除...

c++ list删除元素例子

直接上代码  vs2013 #include "stdafx.h" #include #include #include using namespace std; int _tmain(...

C++ STL list 遍历删除问题

C++ STL list 遍历删除崩溃 错误用法一 下面这种用法会在for的地方崩溃,分析 第一次for循环的时候 it=0,当t.erase(it)执行完成之后 it就变成了 -17891602 表...

C++/STL用erase删除元素(vector,deque),(list,set,map)

STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时...

STL:循环删除容器中元素的方法和陷阱

算法大师Donald Knuth:不成熟的优化是一切恶果的根源(Permature optimization is the root of all evil )。   STL中的容器主要是两种:序...

循环删除list中元素的方法

我的总结:这个小知识点在阿里巴巴开发手册,以及很多图书上都看到过,其实我们如果不注意,使用的时候很容易惯性思维的用for循环来删除,如果只删除一个特定元素,还不会报错,但是如果后期集合改变的话,很容易...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对C++ STL,list元素的循环删除操作
举报原因:
原因补充:

(最多只允许输入30个字)