Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;std::按键的降序映射项_C++_Sorting_Stdmap - Fatal编程技术网

C++ C++;std::按键的降序映射项

C++ C++;std::按键的降序映射项,c++,sorting,stdmap,C++,Sorting,Stdmap,如何使用键值按降序排列的std::map容器 例如,如果插入以下项目: [2 , 5] [1 , 34] [3 , 67] 它们将在地图中排序,如: position 0: [1, 34] position 1: [2, 5] position 2: [3, 67] 我可以反向遍历映射,但假设下次插入[-1,60]。是否将其放置在第一个位置?std::map已排序,因此您只需使用反向迭代器遍历贴图 但是,映射不是数组。地图上没有“第n个位置”这样的东西。(std::map最常用的实现方式是使

如何使用键值按降序排列的std::map容器

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

[2 , 5]
[1 , 34]
[3 , 67]
它们将在地图中排序,如:

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

我可以反向遍历映射,但假设下次插入[-1,60]。是否将其放置在第一个位置?

std::map
已排序,因此您只需使用
反向迭代器遍历贴图


但是,映射不是数组。地图上没有“第n个位置”这样的东西。(
std::map
最常用的实现方式是使用某种二进制搜索树。)如果您绝对不可避免地需要手动指定顺序,那么使用
std::vector
当默认顺序不适合您时,请使用自定义比较器。
将其作为第三个模板参数传递(通常默认为
std::less
)。
在您的情况下,可以使用
std::greater

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

指定对象的去向有点违背了贴图的用途。如果这是你想要的功能,你最好使用一个数组。想想看,一个映射只是将你的项目散列并将它们放入一个“随机”位置,这样你就可以在O(1)时间内再次访问它们,而不必担心它们位于何处。如果可以将它们存储在特定位置,则可以将它们二进制搜索到数组中,或对元素进行排序并逐个插入。@AlejandroLucena否,这是
std::unordered\u map
。通常的
std::map
类已排序。我对你的答案投了反对票,因为它没有抓住要点。OP说反向迭代不是一个选项。此外,如果需要的话,可以将地图从大到小排序。为什么建议在这里使用
reverse\u iterator
S@P0W因为
iterator
首先走错了方向?@jrok可以说(这最多是你个人的意见)。@user3447428 OP说“我想插入…”而不是横切。请提供一个例子。。我怎样才能把它按相反的顺序排序。。。谢谢。@user2422669这就是示例,只需将您的地图替换为类似的地图。@user2422669建议您查看以下内容:。其出版日期为1995年。但是,这将有助于理解
映射始终是排序的,具有二进制搜索树的常见性能特征(例如,在映射实现中可能仍然是一棵红黑树),并且可以按照jrok所示从低到高或从高到低进行排序。如果密钥是用户定义的,则需要了解等式(
=
)和小于(
)应该添加
#include
#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]