1. 程式人生 > >C++ STL list 遍歷刪除問題

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;
}