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; }
感激閱讀,希望能協助到大家,謝謝大家對本站的支持!