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 将按数字键自动排序
像这样的简单地图
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 将按数字键自动排序