假设我有一个std::map<std::string,int>
,这个映射存储了一个id和一个债务金额。我想知道是否有一种方法可以从map中获得5个最高(int)值。我知道我可以遍历映射并进行自定义排序,但是有没有一种自定义算法可以帮助我做到这一点呢?最有效的方法是什么?
发布于 2014-11-29 09:21:07
仅当您在插入到地图时将它们保存在另一个位置并对其进行维护时。地图只是一张地图...得到最高的5在地图上是o(N)。如果您在插入时管理它们,则可以在o(1)中执行此操作
发布于 2014-11-29 09:21:45
创建地图std::map<int, std::string>
并将旧地图中的所有数据插入到此地图中。则从新地图末尾开始的5个关键字具有最高值。
发布于 2014-11-29 10:35:45
您可以在map中构建迭代器的向量:
#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;
}
https://stackoverflow.com/questions/27200694
复制