2010-11-24 93 views
4

當迭代std::map<X,std::vector<Y> >時,我可以對向量排序,還是可能會使迭代器失效?迭代std :: map <X,std :: vector <Y>>並排序向量

換句話說,下面的代碼好嗎?

typedef std::map<int, std::vector<int> > Map; 
Map m; 
for (Map::iterator it = m.begin(); it != m.end(); ++it) { 
    std::sort(it->second.begin(), it->second.end()); 
} 

回答

6

您的代碼沒問題。當您從地圖中移除元素時,map的迭代器只會失效。修改STL容器的元素不會使該容器的迭代器失效,只會對容器本身進行操作,例如刪除或有時添加元素。

+2

這有點模糊甚至誤導。 Re「從映射中迭代器只有在刪除元素時纔會失效」 - 只有刪除特定元素的迭代器纔會失效。一般情況下,STL的容器和他們的迭代器只能通過「刪除或者有時候添加元素」而失效 - 這些操作都不會使迭代器變爲std :: map,std :: multimap,std :: set等。 – 2010-11-24 16:25:53

2

您的代碼非常好。事實上,您不應該有任何疑問,因爲您既不插入也不刪除map中的元素:map的結構不變,您隻影響存儲的值。

0

正如aschepler所說,你的代碼很好。我只補充說,地圖作爲其目標的矢量與任何矢量內的值之間存在區別。因此,您可以更改矢量內的值而不影響地圖。

+0

我不是確定你在說什麼區別...你能澄清一下嗎? – HighCommander4 2012-05-15 03:42:46

2

這裏有些錯誤信息,std :: maps也是如此,你可以在不破壞現有迭代器的情況下插入新元素,刪除元素只會使該特定元素的任何迭代器失效。給定一個迭代器到地圖中,你不可以修改鍵值(否則排序順序會被破壞 - 一個容器的不變量),但是你可以修改你喜歡的值。你的數組排序屬於最後一個操作類別,並且非常好。

要從SGI STL頁面引用:http://www.sgi.com/tech/stl/Map.html

地圖有插入新元素到地圖並不能否定指向現有元素的迭代器的重要屬性。從地圖擦除元素也不會使任何迭代器失效,當然,除了實際指向正在被擦除的元素的迭代器。

相關問題