C++:在迭代中刪除map的成員 首先要清楚一點,迭代器相當于是容器上的指針,容器可以自己管理內
存,因此迭代器可能失效。
如果你在不知情的情況下使用了失效的迭代器,后果是不可預料的。可能程序立即崩掉,也可能什么事都沒有發生。崩掉了算你
幸運,因為你至少知道出了問題,不然有你受的。
回到正題,我想說什么呢?
比如:

程序代碼
map<string,int> theMap;
// add something
to theMap...
for(auto iter1 = theMap.begin(); iter1 !=
theMap.end(); ++iter1)
{
if(iter1->second == xxx)
{
theMap.erase(iter1); //#1
erase the element ??!!
}
}
看樣子貌似非常正常的一
段代碼。在一個map中尋找值為xxx的項并刪除。
但是實際上這個代碼是完全錯誤的,會導致無法預料的結果。
問題就在#1處。一
旦你erase了一個iterator指向的內容,這個iterator就無效了。
這時候你再對這個iterator做任何操作其結果都是未定義
的。
那么該怎么辦呢?
還好,對于map這種以指針構建起來的容器來說,可以保證一個元素刪除了,不影響指向其它元素的迭代器。
因
此就可以這樣做(《C++Standard Library》上建議的正確做法):

程序代碼
for(auto iter1 = theMap.begin(); iter1 !=
theMap.end(); )
{
if(iter1->second == xxx)
{
theMap.erase(iter1++); //#1
}else
{
++iter1;
}
}
這
個遍歷把迭代器的自增從for頭部中取出,丟到循環體中去。#1處,iter1++這個運算先自增,但是卻返回了自增前的迭代器的一個臨時拷貝。然后這個
臨時迭代器指向的內容被刪除了,但是iter1本身已經自增到下一個位置了,不受影響。