常量地图的意外排序

An unexpected sorting of const map

本文关键字:外排序 意外 地图 常量      更新时间:2023-10-16

我已经声明了一些键和值的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>>