- int main(int argc, char* argv[])
- {
- map<string, string> mapData;
- mapData["a"] = "aaa";
- mapData["b"] = "bbb";
- mapData["c"] = "ccc";
- for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); i++)
- {
- if (i->first == "b")
- {
- mapData.erase(i);
- }
- }
- return 0;
- }
錯誤:
i指針在元素被刪除后失效了,回到for語句中與mapData.end() 進行比較錯誤,這個一般都了解。
下面這個是正確刪除方法:
- int main(int argc, char* argv[])
- {
- map<string, string> mapData;
- mapData["a"] = "aaa";
- mapData["b"] = "bbb";
- mapData["c"] = "ccc";
- for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)
- {
- if (i->first == "b")
- {
- mapData.erase(i++);
- }
- else
- {
- i++;
- }
- }
- return 0;
- }
這里貼出一個新的錯誤:
- int main(int argc, char* argv[])
- {
- map<string, string> mapData;
- mapData["a"] = "aaa";
- mapData["b"] = "bbb";
- mapData["c"] = "ccc";
- for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)
- {
- if (i->first == "b")
- {
- mapData.erase(i/*++*/);
- }
- else
- {
- /*i++*/;
- }
- i++;
- }
- return 0;
- }
這同樣是另外一個錯誤。i++操作主要做三件事情:
1、首先把i備份一下。
2、把i加上1。
2、返回第一步備份的i。
mapData.erase(i++);
在執行erase之前,i已經被加1了。erase會使得以前那個未被加一的i失效,而加了一之后的新的i是有效的。
mapData.erase(i); // erase以后 i已經失效,不能再用i++;
i++;
那么erase操作直接讓i失效,對失效的i進行加一操作也是失效的。
mapData.erase(i++);
這段代碼的真正等效代碼是
map<string, string>::iterator iterTemp = i;
++i;
mapData.erase(iterTemp);