C++中的std::map<string, string>是有序的吗?

26

STL的map有序吗?

具体来说,我想知道std::map是否有序。如果我对其进行迭代,那么它是否会首先迭代插入的第一个字符串。

那么下面的迭代顺序将始终是A,C,然后B吗?

std::map<string,string> str_map;

str_map.insert(std::make_pair("A","Data"));
str_map.insert(std::make_pair("C","Data"));
str_map.insert(std::make_pair("B","Data"));

5
是的,你可以传入自己的比较函数,以便按照你想要的方式进行排序。http://www.cplusplus.com/reference/stl/map/ - leetNightshade
4
CodingQuant:实际上,你的例子并不是很好,因为它没有区分“有序”这个词的两个含义:插入顺序和字典序。std::map保留的是字典序,而不是插入顺序。 - j_random_hacker
3
严谨地说,如果你的比较函数是基于字典序比较的话,std::map 才能维护字典序。 - Oliver Charlesworth
4
可能是 A std::map that keep track of the order of insertion?的重复问题,https://dev59.com/lmsz5IYBdhLWcg3wy7LU - Ciro Santilli OurBigBook.com
2个回答

55

STL的map有序吗?

是的,std::map<K,V> 基于键 K 的大小关系,默认使用 std::less<K> 来比较对象,所以是有序的。

如果我对其进行迭代,它会按照插入字符串的顺序进行迭代吗?

不会。它将根据排序顺序进行迭代,而不是您插入元素的顺序。在 std::string 的情况下,它按词典顺序(字母顺序)排序。

如果您想要按照插入顺序进行迭代,最好使用序列容器,如 std::vectorstd::list


谢谢 - 但是按字母排序吗?我已经更新了问题,把C放在B的前面。非常感谢。 - CodingHero
@CodingQuant:回答已相应更新。 - Oliver Charlesworth

5

std::map是使用给定类型的operator<进行排序,或者如果在构造函数中提供了自定义比较函数/函数对象,则使用自定义比较函数/函数对象进行排序。

因此,当您遍历该映射时,您获得的第一个项目不会是您最先插入的项目-它将是按字母顺序排列的第一个项目。

当然,对于您的示例代码,这没有任何区别,因为“A”是您插入的第一个键,也是按字母顺序排列的第一个键。


1
默认情况下,std::map使用std::less<Key>。它的工作原理取决于Key的类型,但对于普通的STL类型,通常是operator< - Martin York

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接