【问题标题】:Find N-th most occurring keys in map在 map 中查找第 N 个出现次数最多的键
【发布时间】:2014-03-10 21:50:44
【问题描述】:

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

数据结构:

map<string, unsigned int>

这是我的地图示例:

【问题讨论】:

  • 你很幸运,地图中的所有键只出现一次。
  • @LuchianGrigore:嗯,该值表示密钥在我的应用程序中出现的次数。
  • std::partial_sort_copy 可能会有所帮助。
  • @LuchianGrigore 还有 STL multimap 允许重复键,但 map 只允许唯一键。

标签: c++ algorithm sorting map performance


【解决方案1】:

以下可能会有所帮助:

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

【讨论】:

  • @TemplateRex:我需要从std::pair 中的键std::string 中删除const...
  • 我复制了您的代码并在 MCVS2012 高级版中使用以下标头进行了尝试:#include #include #include #include #include ,但仍然得到很多错误。我错过了什么吗?
【解决方案2】:

我没有时间发布工作代码,但这是你可以做的事情:
1) 你可以制作另一个 multimap
2) 使用向量

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

我想找到第 N 个出现次数最多的键并按降序排列它们。

如果 NNOT large ,最好创建一个大小为 Nheap ,其中每个节点将包含 pair> 。

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多