根据值对地图进行排序

时间:2014-11-29 09:16:15

标签: c++ map

假设我有std::map<std::string,int>这张地图存储了一个ID以及一笔债务金额。 我想知道是否有办法从地图中获取5个最高(int)值。 我知道我可以遍历地图并进行自定义排序但是有一个自定义算法可以帮助我实现这一目标吗?最有效的方式是什么?

3 个答案:

答案 0 :(得分:2)

只有在插入地图并保存时才将它们保存在其他位置。 地图只是一张地图.... 获得最高5将是地图上的o(N)。如果您在插入时管理它们,可以在o(1)

中进行

答案 1 :(得分:0)

创建地图std::map<int, std::string>并将旧地图中的所有数据插入此地图。 然后新地图末尾的5个键值最高。

答案 2 :(得分:0)

你可以在地图中构建一个迭代器向量:

#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

int main()
{
    // make some data
    using data_map_type = map<string, int>;
    data_map_type data_map = {
        { "a", 10 },
        { "b", 5 },
        { "c", 3 },
        { "d", 3 },
        { "e", 4 },
        { "f", 1 },
        { "g", 2 },
        { "h", 5 },
        { "i", 0 },
        { "j", 2 },
        { "k", 1 },
    };

    // build reverse index (initially unordered)
    std::vector<data_map_type::const_iterator> second_index;
    for(auto it = begin(data_map) ; it != end(data_map) ; ++it)
        second_index.push_back(it);

    // order the secondary index by descending debt amount
    sort(begin(second_index),
         end(second_index),
         [](const data_map_type::const_iterator& l,
            const data_map_type::const_iterator& r)
         {
             return l->second > r->second;
         });

    // emit the top 5 (or fewer)
    const auto limit = std::min(second_index.size(), size_t(5));
    cout << "top " << limit << " entries:" << endl;
    for(size_t i = 0 ; i < limit ; ++i)
    {
        cout << "key=" << second_index[i]->first << ", value=" << second_index[i]->second << endl;
    }

    return 0;
}