C++ STL list 遍歷刪除出錯處理方案。本站提示廣大學習愛好者:(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;
}
感激閱讀,希望能協助到大家,謝謝大家對本站的支持!