【问题标题】:Strange order in std::map with russian text带有俄语文本的 std::map 中的奇怪顺序
【发布时间】:2017-10-23 04:22:39
【问题描述】:

这样的简单地图

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 是一个 sorted 容器,它按 key 排序。而在Cyrillic alphabet в 位于 п 之前。
  • 是的 - 正是!谢谢!
  • @Someprogrammerdude 当然,所讨论的字母顺序和相应的 Unicode 代码(无论哪种)的顺序可能会或可能不会有任何相似之处。

标签: c++11 stl stdmap


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    工作代码如下:

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

    但请记住,unordered_map 没有顺序保证!

    【讨论】:

    • 工作?凭什么? std::unnordered_map 是无序的,即不保证任何顺序。
    • 一般的问题是为什么创建了如此奇怪的订单 - 在这个变体中按预期工作,但当然“没有任何订单可以保证” - 你是绝对正确的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多