迭代std :: map <x,std :: vector <y>&gt;并对矢量</x,std :: vector <y>进行排序

时间:2010-11-24 15:55:32

标签: c++ stl map iterator

当迭代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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

你的代码非常好。事实上,你不应该怀疑,因为你既没有插入也没有从map删除元素:map的结构没有改变,你只影响存储的值。 / p>

答案 2 :(得分:2)

这里有一些错误的信息,因此,std :: maps的特殊之处在于你可以在不使现有迭代器失效的情况下插入新元素,并且删除元素只会使对该特定元素的任何迭代器无效。给定地图中的迭代器,您可能无法修改密钥(否则排序顺序将被破坏 - 容器的不变量之一),但您可以根据需要修改值。你的数组排序属于最后一类操作,非常好。

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

  

Map具有以下重要特性:将新元素插入到映射中不会使指向现有元素的迭代器无效。从地图中删除元素也不会使任何迭代器无效,当然,除了实际指向正在被删除的元素的迭代器之外。

答案 3 :(得分:0)

正如aschepler所说,你的代码很好。我只是补充说,地图作为目标的矢量与任何矢量内的值之间存在区别。因此,您可以更改矢量内的值而不会影响地图。