我'm aware that map is not prepared to be sorted. It' s针对快速和随机密钥访问进行了大量优化,实际上不支持 std::sort
.
我目前的问题是我已经完整 map<std::string,int>
,我将不再使用了 . 我只需要在 value(int)
顺序中提取10对并销毁它 .
如果可能的话,最好的方法是将它排序到位,然后迭代10次,但这显然不是解决方案 .
我正在尝试不同的解决方案,通过 multimap<int,string>
(允许重复键),但我想知道是否有更优雅的解决方案,使用stl算法尽可能多 .
EDIT:
我正在使用 Map ,因为在99%的时间里,我需要它作为 Map :快速键查找以增加值 . 当我不再需要 Map 时,只需要一个好的方法稍后提取值顺序 .
目前的做法应该是:
-
std::copy
map(std::string,int)
到vector(pair(std::string,int))
-
对矢量进行排序
-
获取前10个值
-
摧毁矢量和 Map
5 回答
Map 存储为按键顺序排序的树 . 你想要10个最小(或最大)的整数值及其键,对吗?
在这种情况下,迭代 Map 并将所有键值对放在一对矢量中(
std::vector<std::pair<std::string, int> >)
. 我认为你可以使用std :: vector的双迭代器-arg构造函数 . 然后在向量上使用std::partial_sort
指定partial_sort的比较器,通过比较int值来比较对,忽略键字符串 . 然后你在向量的开头就有你想要的10对,而其余的向量包含未指定的剩余对订购 .代码(未经测试):
请注意,如果有多个字符串具有相同的值,则限制为10的任一侧,则不会指定您获得的字符串 . 在整数相等的情况下,您也可以通过让比较器查看字符串来控制它 .
对于按值迭代,您可以使用boost::multi_index . 它看起来如下:
您可以使用任何索引进行迭代(
val_str
或val_int
) .可能不是最优雅的方式,但您可以通过集合中的值对它们进行排序:
如果使用map迭代器进行迭代,则将获得按键排序的项,因为它在内部使用 balancer 二叉树来存储值 . 所以你可以使用迭代器从中提取10个值 . 这是你想要的还是你想要做的其他事情?请澄清 .
编辑:您可以直接使用set并传递比较函数,而不是使用向量和排序 . 然后你可以提取前10个元素 . 这是我的测试代码:
另一种可能性是构建反向 Map . 对你而言
std::map<int, std::string>
. 反向映射中的条目按其值排序 .以下是我在工具箱中用于此类场合的内容:
此代码假定值也是唯一的(如果不是这样,则抛出断言) . 如果这不适用于您的问题,您可以轻松更改代码以使用多 Map .