2011-06-05 42 views
5

我有一個在全局內存中定義的地圖。 我在重複它,假設我在第三個元素。現在我調用另一個在同一個地圖上生成自己的迭代器的函數,但是它可能會擦除地圖中的第4或第5個元素。 我的問題是,當我從該函數返回並繼續迭代地圖(我提醒你我在第三個元素)時,我的迭代器可能無效或安全嗎?遍歷地圖並調用刪除其他元素的函數就是地圖

對不起,我不能附加代碼,它是非常非常長。

感謝

編輯: 我的問題是這樣的:

map<string,string> mapi; 

void er() { 
    mapi.erase("t"); 
} 

int main() { 


mapi.insert(pair<string,string>("w","a")); 
mapi.insert(pair<string,string>("e","a")); 
mapi.insert(pair<string,string>("r","a")); 
mapi.insert(pair<string,string>("t","a")); 
mapi.insert(pair<string,string>("A","a")); 
mapi.insert(pair<string,string>("u","a")); 
mapi.insert(pair<string,string>("C","a")); 

map<string,string>::iterator it; 
for (it=mapi.begin(); it!=mapi.end(); it++) { 
    cout << it->first << endl; 
    if (it->first=="t") 
     er(); 
} 

}

在這種情況下,我抹去相同的元素 - Valgrind的說,它的錯誤。但是,當我刪除其他元素似乎工作正常。

+0

創建一個簡單的用例並對其進行測試。 – Xeo 2011-06-05 12:31:21

+0

@Xeo:這不會*保證*它是安全和定義的。 – 2011-06-05 12:33:12

+0

我創造了很簡單的東西。似乎工作,但我只想要其他人的意見只是爲了確保 – 2011-06-05 12:33:43

回答

7

http://www.sgi.com/tech/stl/Map.html來自:

刪除從圖中的元素也 不違反對迭代器, 除外,當然,對於 實際上指向是 被擦除元件迭代器。

+0

如果您擦除當前元素,則返回值將爲您提供一個新的有效迭代器以繼續執行(而不是遞增導致未定義行爲的無效迭代器)。有時可能重新安排循環來利用這一點。 – 2011-06-05 12:45:23

+2

擦除()在地圖中是無效的。沒有迭代器返回 – 2011-06-05 12:47:58

+0

@rob您是對的;我正在考慮順序要求。對於map m.erase(i ++)'可以做到這一點(後增量的少數好用途之一)。 – 2011-06-05 15:42:46