2012-03-12 65 views
2

好吧,我已經遇到過這個問題多次,並認爲這將是很好的把這個扔在SO上的好人。從容器中刪除元素時,通過它們迭代

說我已經做了一個類,讓我們稱之爲資源。 因此,Resource類有一個布爾變量,它指示任何實例處於活動狀態的天氣。

現在,我創建了一個容器來保存對資源類型對象的引用。

隨着時間的推移,其中一些被取消激活,我想刪除這些停用的對象,以便釋放內存。 總是我試着做到這一點:嘗試迭代容器中的元素並刪除標記爲非活動狀態的元素。這顯然會導致迭代器失效的問題,並且程序開始拋出運行時錯誤。

因此,最後,我的問題是,根據某些只能通過查看對象的內容才能評估的條件來安全刪除對象的最佳方法是什麼。

+1

[迭代時刪除]的​​可能重複(http://stackoverflow.com/questions/3901356/deleting-while-iterating) – 2012-03-12 11:53:33

+0

可能重複[迭代向量,刪除某些項目,我去](http:// stackoverflow.com/questions/1604588/iterate-vector-remove-certain-items-as-i-go) – 2012-03-12 12:26:26

+0

不只是討論向量或列表,還有地圖和其他關聯容器。 – angryInsomniac 2012-03-13 06:27:20

回答

4

使用erase-remove idiomstd::remove_if。例如:

std::vector<int> myvec; 
... 
myvec.erase(std::remove_if(myvec.begin(),myvec.end(), [] (int i) -> bool { return false; }), myvec.end()); 
+0

關於像地圖這樣的關聯容器怎麼樣? std :: remove_if不爲他們工作,我收集。 – angryInsomniac 2012-03-13 06:25:16

+0

@angryInsomniac:不,它不起作用,因爲它會破壞排序。 [這個問題](http://stackoverflow.com/questions/9515357/map-lambda-remove-if)爲這個問題提供了一個答案。 – KillianDS 2012-03-13 07:30:15

0

最安全的方法是使用std::remove_if。這會將與給定謂詞匹配的所有項目移動到序列的末尾。你可以刪除它們。

+0

關於像地圖這樣的關聯容器怎麼樣? – angryInsomniac 2012-03-13 06:24:47

+0

通過映射,您可以刪除迭代器指向的元素,而不會使任何其他迭代器失效。這意味着你可以做'your_map.erase(it ++);'。請參閱[此問題](http://stackoverflow.com/questions/6438086/)以獲取更多信息。 – 2012-03-13 07:28:04