如何按值对STL地图进行排序?

Cha*_*pps 49 c++ sorting algorithm dictionary stl

如何按值实现STL地图排序?

例如,我有一张地图m:

map<int, int> m;
m[1] = 10;
m[2] = 5;
m[4] = 6;
m[6] = 1;
Run Code Online (Sandbox Code Playgroud)

我想按照m价值对地图进行排序.所以,如果我打印地图,我想得到如下结果:

m[6] = 1
m[2] = 5
m[4] = 6
m[1] = 10
Run Code Online (Sandbox Code Playgroud)

我怎样才能以这种方式对地图进行排序?有什么方法可以用排序值处理键和值吗?

Chr*_*ung 61

将所有键值对转储到set<pair<K, V> >第一个中,其中set使用一个小于函数来构造,该函数仅比较该对的第二个值.这样,即使您的值并非完全不同,您的代码仍然有效.

或者将键值对转储到a中vector<pair<K, V> >,然后使用相同的less-functor对该向量进行排序.

  • 要对对矢量进行排序:http://stackoverflow.com/questions/279854/how-do-i-sort-a-vector-of-pairs-based-on-the-second-element-of-the-pair (4认同)
  • 将地图"转储"到矢量:`vector <pair <K,V >> v(m.begin(),m.end());`http://stackoverflow.com/questions/684475/c-如何对复制一个映射到一个矢量 (4认同)
  • 一个问题,你现在不使用双内存吗? (2认同)
  • 恕我直言,如果值不完全不同,`set` 想法将不起作用。如果你执行 `myset.insert(make_pair(1, 1));` 和 `myset.insert(make_pair(2, 1))`,那么如果函子只比较第二个值,第二个对不会被插入,因为对于该集合,两个项目是相同的。 (2认同)

swe*_*egi 31

您可以构建第二个地图,第一个地图的值作为键,第一个地图的键作为值.

仅当所有值都不同时,此方法才有效.如果你不能假设这一点,那么你需要构建一个多图而不是一个地图.

  • 如果没有,请使用多图. (18认同)
  • 如果所有值都是唯一的,那就没问题.如何处理具有相同值的多个键?所以这个解决方案并不好! (4认同)
  • 这甚至不是一个解决方案。如果值都相同怎么办?那么你的第二张地图将只有 1 个元素! (2认同)

Kon*_*lph 16

我想知道如何按值实现STL映射排序.

根据定义,你不能.映射是一种按键对其元素进行排序的数据结构.

  • @Charlie Epps:还有另一张地图?每次向第一个映射添加键/值时,都会向第二个映射添加值/键... (2认同)

rlb*_*ond 5

您应该将Boost.Bimap用于此类事情。

  • 实际上,Boost.Bimap支持非一对一的操作。例如,`bimap&lt;multiset_of&lt;int&gt;, set_of&lt;double&gt; &gt;` (2认同)