使用std::map<int, ...>
,我如何确保在插入时迭代它时按照整数键的升序进行?
您不需要做任何事情。根据键的值,该映射将按升序排列。
内部,该映射对键进行比较以对其元素排序。默认情况下,它使用std :: less<KEY>
,对于整数等同于bool operator <(int,int)
。对于用户定义的类型,您有两个选项:
实现bool operator <(const MyType&,const MyType&)
,用于实现严格弱序比较用户定义的类型之间的比较。如果您的类型具有自然排序,则使用此选项
提供一个二进制函数对象,实现严格弱序,您可以将其作为第三个模板参数传递给映射。如果您的类型没有自然顺序,或者如果要使用与由std :: less<Key>
使用的顺序不同的顺序构建映射,则使用此选项通过从第1点的bool operator<(...)
来实现。
通常在后台发生的是,该映射被实现为自平衡二叉树,并且使用严格弱序将新元素放入映射中,并确定两个元素是否相等。顺便说一句,相同的逻辑适用于std :: set
,其中键和值是相同的。
std::less
。 - user784668std::map
提供一个排序函数(或函数对象)。如果没有提供,则默认为std::less
,它又默认使用<
。除非您的类具有自然排序(例如<
,>
等在一般情况下是有意义的),否则提供排序运算符是最佳解决方案。 - James Kanzestd::map
的工作原理。现在它有意义了,谢谢! - danijarstd::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
第三个模板参数的默认参数是std::less<T>
,因此上述m1
和m3
是相同类型!#include <iostream>
#include <map>
#include <string>
int main()
{
std::cout << "\nkeys are in increasing order: \n";
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 << "}\n";
std::cout << "\nkeys are in decreasing order: \n";
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 << "}\n";
}
输出:
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
,它不会对元素进行排序。std::map<int, X, std::greater<>>
- jaques-sammap
通常被实现为二叉搜索树,因此迭代器会给你已排序的键。
如果您不关心顺序,可以使用unordered_map
(来自c++11或boost),这将在交换顺序的同时提供一定的速度优势。