如何根据它们的值获取std :: map的前n个键?

Rik*_*ika 8 c++ c++11

如何根据它们的值获取std :: map的前n个键?有没有办法,我可以得到一个说明的列表,例如最大价值的前十个键作为他们的价值?
假设我们有一个类似于此的地图:

mymap["key1"]= 10;
mymap["key2"]= 3;
mymap["key3"]= 230;
mymap["key4"]= 15;
mymap["key5"]= 1;
mymap["key6"]= 66;
mymap["key7"]= 10; 
Run Code Online (Sandbox Code Playgroud)

而且我只想要一个前10个键的列表,它与另一个键相比具有更大的价值.例如,mymap的前4位是

key3
key6
key4 
key1
key10 
Run Code Online (Sandbox Code Playgroud)

注意:
值不是唯一的,实际上它们是每个键的出现次数.我想获得大多数发生的密钥列表

注意2:
如果地图不是一个好的候选人,你想提出任何建议,请按照c ++ 11进行,我当时不能使用提升.

注3:
在使用的情况下,std::unordered_multimap<int,wstring>我还有其他选择吗?

hmj*_*mjd 20

a的顺序map是基于它的键而不是它的值,并且不能重新排序,因此有必要迭代map并维护前十个遇到的列表,或者由Potatoswatter用于评论,以便为您partial_sort_copy()提取前N个值:

std::vector<std::pair<std::string, int>> top_four(4);
std::partial_sort_copy(mymap.begin(),
                       mymap.end(),
                       top_four.begin(),
                       top_four.end(),
                       [](std::pair<const std::string, int> const& l,
                          std::pair<const std::string, int> const& r)
                       {
                           return l.second > r.second;
                       });
Run Code Online (Sandbox Code Playgroud)

在线演示.

选择不同类型的容器可能更合适,boost::multi_index值得研究,其中:

...允许构造容器,维护一个或多个具有不同排序和访问语义的索引.

  • 使用 `std::partial_sort_copy` 可以节省迭代和保持前 N 个的手动工作。 (2认同)