C++ 在std::map上迭代<;十、 标准::向量<;Y>&燃气轮机;并对向量进行排序

C++ 在std::map上迭代<;十、 标准::向量<;Y>&燃气轮机;并对向量进行排序,c++,stl,map,iterator,C++,Stl,Map,Iterator,当在std::map上迭代时,我可以对向量进行排序,还是这会使迭代器无效 换句话说,下面的代码可以吗 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()); } typedef std::map

当在
std::map
上迭代时,我可以对向量进行排序,还是这会使迭代器无效

换句话说,下面的代码可以吗

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());
}
typedef std::map;
地图m;
for(Map::iterator it=m.begin();it!=m.end();++it){
排序(it->second.begin(),it->second.end());
}

您的代码正常。
映射中的迭代器只有在从映射中删除元素时才会失效。修改STL容器的元素不会使该容器的迭代器失效,只会使容器本身的操作失效,例如删除或有时添加元素。

您的代码非常好。事实上,您不应该有任何疑问,因为您既没有从
映射中插入元素,也没有从
映射中删除元素:
映射的结构没有变化,您只影响存储的值。

正如aschepler所说,您的代码很好。我只想补充一点,地图中作为目标的向量和任何向量中的值之间都有区别。因此,您可以在不影响地图的情况下更改向量内的值。

这里有一些错误信息,因此将插入。映射有点特殊,因为您可以插入新元素而不会使现有迭代器无效,删除元素只会使该特定元素的任何迭代器无效。给映射一个迭代器,您可以不修改键(否则排序顺序将被破坏-容器的不变量之一),但您可以随意修改值。数组排序属于最后一类操作,非常好

要引用SGI STL页面中的内容:

Map有一个重要的特性,即在Map中插入新元素不会使指向现有元素的迭代器失效。从映射中删除元素也不会使任何迭代器失效,当然,对于实际指向正在删除的元素的迭代器除外


这有点模糊,甚至有点误导。Re“仅当移除元素时,映射中的迭代器才会失效”-仅移除特定元素的迭代器才会失效。一般来说,是STL容器,它们的迭代器只有通过“删除或有时添加元素”才会失效-这些操作都不会使std::map、std::multimap、std::set等中的迭代器失效。我不确定您所说的区别是什么。。。你能澄清一下吗?