常量地图的意外排序
An unexpected sorting of const map
我已经声明了一些键和值的const映射。地图上的钥匙以无序的方式声明。
#include<iostream>
#include<map>
int main(){
const std::map<std::string, int> ROMES = {
{ "I", 1 },
{ "V", 5 },
{ "X", 10 },
{ "L" , 50},
{ "C", 100 },
{ "D", 500 },
{ "M", 1000 }
};
for( auto const& [key, val] : ROMES ){
std::cout << key
<< ':'
<< std::to_string(val)
<< std::endl ;
}
return 0;
}
地图的内容已打印在控制台上。我很惊讶地图元素是按字母顺序排序的。
C:100
D:500
I:1
L:50
M:1000
V:5
X:10
为什么会这样?什么时候呢?
正如标准所说:
在内部,映射中的元素始终按照其内部比较对象(类型为 Compare(指示的特定严格弱排序标准按其键排序。
因此,当您将元素插入地图时,元素会自动排序。
>std::map
通过比较元素的键对元素进行排序。默认情况下,它使用 std::less
进行比较,std::string
实现operator<
以按字典顺序比较字符串。这就是为什么您会看到元素按字母顺序排序的原因。
对于您想要的内容,您可以为std::map
提供一个自定义比较器,以根据它们所表示的数值来比较键,而不是按字面比较它们。
否则,请改用std::unordered_map
,甚至只是像@Yksisarvinen评论中建议的那样std::vector<std::pair<std::string, int>>
。