C++ 常量映射的意外排序

C++ 常量映射的意外排序,c++,C++,我已经声明了一些键和值的常量映射。地图上的钥匙被乱丢了 #include<iostream> #include<map> int main(){ const std::map<std::string, int> ROMES = { { "I", 1 }, { "V", 5 },

我已经声明了一些键和值的常量映射。地图上的钥匙被乱丢了

#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;
}
为什么会这样?什么时候?

正如上面所说:

在内部,映射中的元素总是按照其键进行排序,并遵循由其内部比较对象Compare类型指示的特定严格弱排序标准

因此,在将元素插入映射时,元素会自动排序。

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

根据您的需要,您可以为std::map提供一个自定义比较器,以根据键所表示的数值来比较键,而不是逐字比较键


否则,请使用std::unordered_映射,甚至只使用std::vector,如注释中建议的@Yksisarvinen

注意:std::*映射类都不会保留顺序。如果需要,请使用std::vectorThey不保留插入顺序。它们确实保留了比较顺序。虽然我想+1这是为了写得好,但对std地图进行任何研究都会立即得出它是一个已排序的集装箱。我对地图元素被排序感到惊讶,为什么会感到惊讶?在我读过的所有文档中都清楚地说明了std::map对键进行排序。除非你期望有一个Java风格的链接哈希映射,否则这并不奇怪。我很好奇为什么会有两个反对票。编辑:可能是OP希望保持插入顺序,而不一定希望对它们进行排序。
C:100
D:500
I:1
L:50
M:1000
V:5
X:10