在地图中查找第N个最常出现的键

时间:2014-02-12 14:04:17

标签: c++ algorithm sorting map performance

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

数据结构:

map<string, unsigned int>

以下是我的地图示例:

enter image description here

2 个答案:

答案 0 :(得分:2)

以下可能会有所帮助:

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;
}

输出:

b 4
c 2

答案 1 :(得分:0)

我没有时间发布工作代码,但这是你可以做的事情:
1)你可以制作另一个多图&lt; int,string&gt;
2)使用矢量&lt;对&gt;

但如果有多个元素,这些将占用很多空间。所以,高效方法应该是:

  

我想找到第N个最常出现的密钥,并按降序排序。

如果N 不大,最好创建一个大小为N,其中每个节点都包含对&gt; 。