【问题标题】:Are c++ std::map<string,string> ordered? [duplicate]c++ std::map<string,string> 是有序的吗? [复制]
【发布时间】:2012-07-01 18:19:56
【问题描述】:

STL 映射是有序的吗?

具体来说,我需要知道 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"));

【问题讨论】:

标签: c++


【解决方案1】:

STL 映射是有序的吗?

是的,std::map&lt;K,V&gt; 是根据键 K 排序的,默认情况下使用 std::less&lt;K&gt; 比较对象。

所以如果我迭代它,它会先用第一个插入字符串进行迭代?

没有。它将根据排序顺序进行迭代,而不是您插入元素的顺序。对于std::string,它按字典顺序(字母顺序)排序。

如果要根据插入顺序进行迭代,最好使用序列容器,例如std::vectorstd::list

【讨论】:

  • 谢谢 - 但它是按字母排序的吗?我已经更新了将 C 放在 B 之前的问题。非常感谢
  • @CodingQuant:答案已相应更新。
【解决方案2】:

std::maps 使用给定类型的operator&lt; 排序,或者使用自定义比较函数/函子(如果作为参数提供给构造函数)进行排序。

所以不,当您遍历地图时,您获得的第一个项目不会是您首先插入的项目 - 它将是按字母顺序排在第一位的项目。

当然对于您的示例代码没有什么影响,因为“A”是您插入的第一个键,也是按字母顺序排列的第一个键。

【讨论】:

  • 默认情况下 std::map 使用std::less&lt;Key&gt;。其工作方式取决于 Key 类型,但对于普通 STL 类型,通常为 operator&lt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2021-09-13
  • 2011-07-26
  • 2012-06-17
相关资源
最近更新 更多