C++ STL list 遍历删除问题

C++ STL list 遍历删除崩溃

错误用法一

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

表明it不能再作为迭代器进行运算,自然会报错。

#include <map>
#include <list>
using namespace std;
typedef std::list<int > TESTLIST;
int _tmain(int argc, _TCHAR* argv[])
{
	TESTLIST t;
	for (int i = 0; i < 10;i++)
	{
		t.push_back(i);
	}

	for (TESTLIST::iterator it = t.begin(); it != t.end();)
	{
		t.erase(it);
		it++;
	}

	return 0;
}

错误用法二

下面这种用法出现的错误与错误一相同

#include <map>
#include <list>
using namespace std;
typedef std::list<int > TESTLIST;
int _tmain(int argc, _TCHAR* argv[])
{
	TESTLIST t;
	for (int i = 0; i < 10;i++)
	{
		t.push_back(i);
	}

	for (TESTLIST::iterator it = t.begin(); it != t.end();it++)
	{
		t.erase(it);
	}

	return 0;
}

错误用法三

下面这种用法以为不it++就不会有事,其实他们的错误都一样,那就是t.erase(it)之后 it已经是非迭代量,自然不能作为迭代操作

#include "stdafx.h"

#include <map>
#include <list>
using namespace std;
typedef std::list<int > TESTLIST;
int _tmain(int argc, _TCHAR* argv[])
{
	TESTLIST t;
	for (int i = 0; i < 10;i++)
	{
		t.push_back(i);
	}

	for (TESTLIST::iterator it = t.begin(); it != t.end();)
	{
		t.erase(it);
	}

	return 0;
}

正确用法

#include <map>
#include <list>
using namespace std;
typedef std::list<int > TESTLIST;
int _tmain(int argc, _TCHAR* argv[])
{
	TESTLIST t;
	for (int i = 0; i < 10;i++)
	{
		t.push_back(i);
	}

	for (TESTLIST::iterator it = t.begin(); it != t.end();)
	{
		t.erase(it++);
	}

	return 0;
}
时间: 2024-10-22 15:38:47

C++ STL list 遍历删除问题的相关文章

STL容器的遍历删除

STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的表项(当然这个函数是应该运行在另起一个线程上的),但是在按照下面的方法对hash_map(用迭代器)遍历删除时,当找到第一个满足删除条件的元素并将其删除后,程序将提示非法: for(list<int>::iterator iter = m_map.begin(); iter != m_map.en

STL容器遍历时删除元素

STL容器遍历时在循环体内删除元素最容易出错了,根本原因都是因为迭代器有效性问题,在此记下通用删除方法,该方法适用于所有容器: 1 std::vector<int> myvec; 2 3 std::vector<int>::iterator it = myvec.begin(); 4 while( it != myvec.end()) 5 { 6 it = myvec.erase(it); 7 } 容器list有个比较另类的删除方法,如下代码所示: std::list<int

STL——遍历 删除 set 元素

==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明作者和出处,并保证文章(包括本声明)的完整性. 未经作者授权请勿修改(包括本声明),保留法律追究的权利. 未经作者授权请勿用于学术性引用. 未经作者授权请勿用于商业出版.商业印刷.商业引用以及其他商业用途. 本文不定期修正完善,为保证内容正确,建议移步原文处阅读. 本文链接:http://www.c

STL中用erase()方法遍历删除元素?.xml

pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9;font-style:italic;font-weight:bold;} .selfFuc{color:#f1f9be;} .bool{color:#69305e;} .condition{color:#628698;font-weight:bold;} .key{color:#e336b6;} .

stl map高效遍历删除的方法 [转]

for(:iter!=mapStudent.end():) { if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指向下面一个结点 mapStudent.erase(iter++): } else { //条件不满足,指向下面一个结点 iter++: } } 这种删除方式也是STL源码一书中推荐的方式,分析 mapStudent.erase(iter++)语句,map中在删除iter的时候,先将iter做缓存,然后执行iter++使之指向下一个结点,再进入er

如何正确遍历删除List中的元素

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合条件的一个元素 3.通过普通的for删除删除符合条件的多个元素 4.通过Iterator进行遍历删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException */ public

map/vector遍历删除

map遍历删除 1 map<int, vector<int>>::iterator it = g_map.begin(); 2 for (; it != g_map.end(); /*it++*/) 3 { 4 g_map.erase(it++); 5 } vector遍历删除 1 vector<int>::iterator iter = vec.begin(); 2 while (iter != vec.end()) 3 { 4 if(*iter == 1) 5 {

23 遍历删除本地目录的方法,文件末尾追加内容,按行读取文件内容

1.遍历删除本地目录 /** * 递归删除非空目录 * @param file */ public static void deletNotEmptyDir(File file){ File[] files = file.listFiles(); if (files != null) { for (File f : files) { deletNotEmptyDir(f); } } file.delete(); } 2.文件末尾追加内容 /** * 在文件末尾追加字符串 * @param fil

java集合类遍历删除方法测试以及使用场景记录

package test0; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; /**