const映射的意外排序

时间:2019-06-13 22:01:07

标签: c++

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

为什么会这样?什么时候?

2 个答案:

答案 0 :(得分:8)

正如standard所说:

  

在内部,映射中的元素总是按照其内部比较对象(类型为Compare)指示的严格严格的弱排序标准按其键进行排序。

因此,将元素插入地图时会自动对其进行排序。

答案 1 :(得分:0)

std::map通过比较元素的键对元素进行排序。默认情况下,它使用std::less进行比较,并使用std::string implements operator<按字典顺序比较字符串。这就是为什么您看到元素按字母顺序排序的原因。

对于您想要的东西,您可以给std::map一个自定义比较器,以根据键代表的数字值比较键,而不用逐字比较它们。

否则,请改用std::unordered_map,甚至可以像评论中建议的@Yksisarvinen那样使用std::vector<std::pair<std::string, int>>