std::map 中的奇怪顺序,带有俄语文本

Strange order in std::map with russian text

像这样的简单地图

std::map<std::string, std::vector<int>> container = {
    {"первый",{1}},
    {"второй",{2}},
    {"третий",{3}},
    {"четвертый",{ 4 }}
};

for (auto it = container.begin(); it != container.end(); ++it)
{
    auto tt = it;
    // do smth
}

但顺序是第二个元素 ({"второй",{2}},) 先行

并且这是依赖于文本的——例如,如果第二个元素是英文文本 "second" ({"second",{2}},)——顺序将是正常的,这将是顺序中的第二个元素。

谁能解释发生了什么,或者这只是 VS 2017 版本 15.3 中的错误?

我的错误是我忘记了 std::map 是一个排序的容器,在我的例子中,关键是“первый”和“второй” - 所以俄语字母“второй”是第一个。

工作代码如下:

std::unordered_map<std::string, std::vector<int>> container = {
    {"первый",{1}},
    {"второй",{2}},
    {"третий",{3}},
    {"четвертый",{ 4 }}
};

但请记住 unordered_map 无法保证订单!

在这种情况下,更好的设计是

std::map<std::vector<int>,std::string> container = {
{{1},"первый"},
{{2},"второй"},
{{3},"третий"},
{{4},"четвертый"}
};
  • 因此 std::map 将按数字键自动排序