C++ 查找地图中第N个最常出现的关键点

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(

我有一个包含不同字符串的映射,以及它们出现的次数。我想找到第N个最常出现的键,并按降序排列。是否有STL函数可以做到这一点?如果不是,在地图容器中执行此操作的有效方法是什么

数据结构:

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
不大,最好创建一个大小为
N
堆,其中每个节点将包含pair>

幸运的是,一个映射中的所有键只出现一次。@LuchianGrigore:这个值表示该键在我的应用程序中出现的次数。可能会有帮助。@LuchianGrigore还有一个STL multimap,允许重复键,但是map只允许唯一的键。@TemplateRex:我需要从
std::pair
中的key
std::string
中删除
const
。我复制了您的代码,并在MCVS2012 premium中使用以下标题进行了尝试:#include#include#include#include#include,但仍然出现很多错误。我错过什么了吗?
b 4
c 2