代码之家  ›  专栏  ›  技术社区  ›  Frank

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

  •  4
  • Frank  · 技术社区  · 13 年前

    迭代时 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 回复  |  直到 13 年前
        1
  •  6
  •   aschepler    13 年前

    你的密码没问题。来自 map 只有从映射中移除元素时才无效。修改STL容器的元素永远不会使该容器的迭代器失效,只会使容器本身的操作失效,比如删除或有时添加元素。

        2
  •  2
  •   Frank    13 年前

    你的代码很好。事实上,您不应该有任何疑问,因为您既没有在 map :的结构 地图 保持不变,则只影响存储的值。

        3
  •  2
  •   Tony Delroy    13 年前

    这里有些误传,也会插嘴。STD:映射有特殊之处,因为你可以插入新元素而不使现有迭代器无效,移除元素只会使任何迭代器失效。给定映射中的迭代器,您不能修改键(否则排序顺序将被破坏-容器的不变量之一),但是您可以随意修改值。数组排序属于最后一类操作,非常好。

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

    MAP具有将新元素插入到映射中的重要属性,并不会使指向现有元素的迭代器无效。从映射中删除元素也不会使任何迭代器失效,当然,对于实际指向要删除的元素的迭代器除外。

        4
  •  0
  •   Simon Courtenage    13 年前

    正如aschepler所说,你的代码是好的。我只想补充一点,地图上的目标向量和任何向量内的值是有区别的。因此,可以在不影响贴图的情况下更改向量内的值。