如何确保订购std :: map?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确保订购std :: map?相关的知识,希望对你有一定的参考价值。
使用std::map<int, ...>
我如何确保在插入时迭代它将按整数键的升序进行?
你不需要做任何事情。地图将根据键的值按升序排列。
在内部,地图执行键之间的比较以对其元素进行排序。默认情况下,它使用std::less<KEY>
,相当于整数的bool operator<(int, int)
。对于用户定义的类型,您必须选择:
- 实现
bool operator<(const MyType&, const MyType&)
,在用户定义的类型之间实现严格的弱排序比较。如果您的类型具有自然顺序,请使用此选项 - 提供实现严格弱排序的二元仿函数,您可以将其作为第3个模板参数传递给映射。如果您的类型没有自然排序,或者您想要通过
std::less<Key>
从第1点开始构建与bool operator<(...)
使用的排序不同的排序,请使用此选项。
幕后通常发生的是地图被实现为自平衡二叉树,严格的弱排序用于在地图中放置新元素,并确定两个元素是否相等。顺便说一下,同样的逻辑适用于std::set
,其中键和值是同一个。
std::map
就是这么做的。你不需要做任何事情。
默认情况下,它按递增顺序对键进行排序。如果您希望按降序排序,则将std::greater<T>
作为第三个模板参数传递给std::map
。
std::map<int, X> m1; //sorts key in increasing order
std::map<int, X, std::greater<int>> m2; //sorts key in decreasing order
std::map<int, X, std::less<int>> m3; //sorts key in increasing order
third template parameter的默认参数是std::less<T>
,所以在m1
和m3
之上是相同的类型!
演示:
#include <iostream>
#include <map>
#include <string>
int main()
{
std::cout << "
keys are in increasing order:
";
std::map<int, std::string> m1;
m1[5] = "first insertion but higher key";
m1[1] = "second insertion but lower key";
for(auto const & item : m1)
std::cout << "{" << item.first <<"," << item.second << "}
";
std::cout << "
keys are in decreasing order:
";
std::map<int, std::string, std::greater<int> > m2;
m2[1] = "first insertion but lower key";
m2[2] = "second insertion but higher key";
for(auto const & item : m2)
std::cout << "{" << item.first <<"," << item.second << "}
";
}
输出:
keys are in increasing order:
{1,second insertion but lower key}
{5,first insertion but higher key}
keys are in decreasing order:
{2,second insertion but higher key}
{1,first insertion but lower key}
请注意,在这两种情况下,项目都按照std::map
的第三个模板参数的指定进行排序。输出不依赖于插入顺序,而是取决于键的顺序!
还有std::unordered_map
不排序元素。
map
通常实现为binary search tree,因此迭代器将为您提供已排序的键。
如果您不关心订单,您可以使用unordered_map
(来自c ++ 11或boost),这将为您提供订单交易的一些速度。
以上是关于如何确保订购std :: map?的主要内容,如果未能解决你的问题,请参考以下文章
尝试对 std::map<int, class> 进行排序时出错