【问题标题】:C++ std::map items in descending order of keysC++ std::map 项按键的降序排列
【发布时间】:2014-04-30 18:16:37
【问题描述】:

我如何使用具有降序键值的 std::map 容器。

例如,如果插入以下项目:

[2 , 5]
[1 , 34]
[3 , 67]

它们将在地图中按如下顺序排列:

position 0: [1, 34]
position 1: [2, 5]
position 2: [3, 67]

我可以反向遍历地图,但假设下次我插入 [-1 , 60]。会放在第一位吗?

【问题讨论】:

  • 指定对象的去向有点违背地图的目的。如果这是您想要的功能,您不妨使用数组。
  • 想一想,地图只是对你的项目进行哈希处理并将它们扔到一个“随机”位置,这样你就可以在 O(1) 时间内再次访问它们,而不必担心它们的位置。如果可以将它们存储在特定位置,则可以将它们二进制搜索到数组中,或者对元素进行排序并逐个插入。
  • @AlejandroLucena 不,那是std::unordered_map。通常的std::map已排序。

标签: c++ sorting stdmap


【解决方案1】:

当默认顺序不适合您时,请使用自定义比较器。
您将它作为第三个模板参数传递(通常默认为 std::less<KeyType> )。
在你的情况下,你可以使用std::greater:

std::map<int, int, std::greater<int> > m;

示例代码:

#include <map>
#include <iostream>
#include <functional>

int main() {
  std::map<int, int, std::greater<int>> m { {-1, 77}, {0, 42}, {1, 84} };
  for (const auto& p : m)
    std::cout << '[' << p.first << ',' << p.second << "]\n";
}

结果输出:

[1,84]
[0,77]
[-1,42]

【讨论】:

  • 你能举个例子吗..我怎样才能把它倒序排列...谢谢。
  • @user2422669 这是示例,只需将您的地图替换为这样的。
  • @user2422669 建议查看这个:The STL (Primer)。假设它的发布日期是 1995 年。但是,这将有助于理解 map 始终是排序的,具有二叉搜索树的通常性能特征(例如,在地图实现的深处可能继续是红黑树),并且可以像 jrok 所示的那样从低到高或从高到低排序。如果密钥是用户定义的,则有必要了解必须实现相等 (==) 和小于 (&lt;) 运算符。
  • 应该加#include&lt;functional&gt;
【解决方案2】:

std::map 已经排序,因此您只需使用reverse_iterator 遍历地图。

然而,地图不是数组。地图中没有“第 n 个位置”这样的东西。 (std::map 最常使用某种二叉搜索树来实现。)如果您绝对,不可避免地需要手动指定顺序,则使用std::vector&lt;std::pair&gt;

【讨论】:

  • 我对您的回答投了反对票,因为它没有抓住重点。 OP说反向迭代不是一种选择。此外,如果需要的话,将地图从大到小排序也是非常好的。
  • 为什么有人会在这里推荐reverse_iterator? :S
  • @P0W 因为iterator 走错了方向,排在首位?
  • @jrok 可以说(这充其量是您的个人意见)。
  • @user3447428 OP 说“我要插入...”不是横向的
猜你喜欢
  • 1970-01-01
  • 2012-05-27
  • 2019-05-03
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2013-05-08
相关资源
最近更新 更多