C++ STL list 遍歷刪除問題
阿新 • • 發佈:2019-01-05
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;
}