遍历std :: map <X,std :: vector <Y>>并对向量进行排序

4
当迭代 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());
}
4个回答

6

你的代码没问题。从map中得到的迭代器只有在你从map中移除元素时才会失效。修改STL容器的元素永远不会使该容器的迭代器失效,只有对容器本身进行的操作,如删除或有时添加元素。


2
这有点含糊甚至是误导性的。关于“从映射中获取迭代器只有在删除元素时才会失效” - 只有指向被删除元素的迭代器才会失效。关于STL容器,它们的迭代器只有在“删除或有时添加元素”时才会失效 - 这两个操作都不会使std :: map,std :: multimap,std :: set等的迭代器失效。 - Tony Delroy

2

你的代码完全没有问题。实际上,你不应该有任何疑虑,因为你既没有插入也没有删除map中的元素:map的结构不变,你只是影响了存储的值。


2
有一些错误的信息,我来解释一下。std::maps在有新元素插入时不会使现有迭代器无效,并且删除元素仅会使指向该特定元素的任何迭代器无效。如果已经拥有指向map中的迭代器,则不能修改键(否则排序顺序将被破坏——容器的不变量之一),但可以随意修改值。您的数组排序属于此类最后一个操作,并且是完全正确的。
引用SGI STL页面上的话:http://www.sgi.com/tech/stl/Map.html 地图具有重要属性,即将新元素插入地图不会使指向现有元素的迭代器无效。从地图中删除元素也不会使任何迭代器无效,除了实际指向正在被删除的元素的迭代器。

0
正如aschepler所说,你的代码很好。我只想补充一点,就是地图作为目标的向量和任何一个向量内部的值之间有区别。因此,你可以更改向量内部的值而不影响地图。

我不确定你在谈论什么区别...你能澄清一下吗? - HighCommander4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接