C++ 查找地图中第N个最常出现的关键点
我有一个包含不同字符串的映射,以及它们出现的次数。我想找到第N个最常出现的键,并按降序排列。是否有STL函数可以做到这一点?如果不是,在地图容器中执行此操作的有效方法是什么 数据结构:C++ 查找地图中第N个最常出现的关键点,c++,algorithm,sorting,map,performance,C++,Algorithm,Sorting,Map,Performance,我有一个包含不同字符串的映射,以及它们出现的次数。我想找到第N个最常出现的键,并按降序排列。是否有STL函数可以做到这一点?如果不是,在地图容器中执行此操作的有效方法是什么 数据结构: map<string, unsigned int> map 以下是我的地图示例: 以下内容可能会有所帮助: struct comp { using P = std::pair<const std::string, std::size_t>; bool operator(
map<string, unsigned int>
map
以下是我的地图示例:
以下内容可能会有所帮助:
struct comp
{
using P = std::pair<const std::string, std::size_t>;
bool operator() (const P&lhs, const P& rhs) const
{
return rhs.second < lhs.second;
}
};
int main(int argc, char *argv[])
{
const std::map<std::string, std::size_t> m = {{"a", 1}, {"b", 4}, {"c", 2}};
std::vector<std::pair<std::string, std::size_t>> res(2);
std::partial_sort_copy (begin(m), end(m), begin(res), end(res), comp());
for (const auto& e : res) {
std::cout << e.first << " " << e.second << std::endl;
}
return 0;
}
我没有时间发布工作代码,但您可以做以下事情:
1) 您可以创建另一个多重映射
2) 使用向量
如果
N
不大,最好创建一个大小为N
的堆,其中每个节点将包含pair> 幸运的是,一个映射中的所有键只出现一次。@LuchianGrigore:这个值表示该键在我的应用程序中出现的次数。可能会有帮助。@LuchianGrigore还有一个STL multimap,允许重复键,但是map只允许唯一的键。@TemplateRex:我需要从std::pair
中的keystd::string
中删除const
。我复制了您的代码,并在MCVS2012 premium中使用以下标题进行了尝试:#include#include#include#include#include,但仍然出现很多错误。我错过什么了吗?
b 4
c 2