C++ std :: map项按键的降序排列

Sig*_*ont 23 c++ sorting stdmap

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

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

[2 , 5]
[1 , 34]
[3 , 67]
Run Code Online (Sandbox Code Playgroud)

他们将在地图上订购,如:

position 0: [1, 34]
position 1: [2, 5]
position 2: [3, 67]
Run Code Online (Sandbox Code Playgroud)

我可以反向迭代地图,但假设我下次插入[-1,60].它会被放在第一个位置吗?

jro*_*rok 45

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

std::map<int, int, std::greater<int> > m;
Run Code Online (Sandbox Code Playgroud)

示例代码:

#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";
}
Run Code Online (Sandbox Code Playgroud)

结果输出:

[1,84]
[0,77]
[-1,42]
Run Code Online (Sandbox Code Playgroud)

  • @ user2422669这是一个例子,只需用这样的地图替换你的地图. (3认同)

use*_*428 -1

std::map已经排序了,所以你只需要使用 来遍历地图reverse_iterator

然而,地图不是数组。地图上不存在“第 n 个位置”这样的东西。(std::map最常见的是使用某种二叉搜索树来实现。)如果您绝对不可避免地需要手动指定顺序,那么请使用std::vector<std::pair>.

  • 我否决了你的答案,因为它没有抓住要点。OP说反向迭代不是一种选择。另外,如果需要的话,将地图从大到小排序也是完全可以的。 (7认同)