代码之家  ›  专栏  ›  技术社区  ›  Lightness Races in Orbit

multimap是否保证插入顺序与初始值设定项中给定的元素顺序匹配?

  •  4
  • Lightness Races in Orbit  · 技术社区  · 5 年前

    如果我这样做:

    #include <map>
    #include <iostream>
    
    int main()
    {
        std::multimap<char, int> m;
    
        m.emplace('a', 100);
        m.emplace('b', 200);
        m.emplace('b', 201);
        m.emplace('c', 300);
    
        for (const auto& p : m)
            std::cout << p.first << '\t' << p.second << '\n';
    }
    

    ……然后, since C++11 ,我保证有价值的元素 200 将在元素前面加上值 201 .

    但是如果我这样做呢?

    #include <map>
    #include <iostream>
    
    int main()
    {
        std::multimap<char, int> m{
           {'a', 100},
           {'b', 200},
           {'b', 201},
           {'c', 300}
        };
    
        for (const auto& p : m)
            std::cout << p.first << '\t' << p.second << '\n';
    }
    

    我们是否保证“插入顺序”与初始化器中的元素顺序匹配?

    A quick test 结果令人鼓舞,但并不能证明什么。

    我正在写C++ 17。

    (我可以切换到 std::map 有了一个复合键,但我有成千上万的这些东西是由一个公共接口管理的,只有少数包含重复的键,所以我不想全面介绍这种复杂性。)

    1 回复  |  直到 5 年前
        1
  •  4
  •   Barry    5 年前

    [associative.reqmts] :

    …I和J满足 输入迭代器要求并引用隐式转换为值类型的元素,[i,j)表示 有效范围…IL指定类型的对象 initializer_list<value_type>

    Expression    Assertion/note
                  pre-/post-condition
    
    X(i,j,c)      Effects: Constructs an empty container
                  and inserts elements from the range [i, j)
                  into it; uses c as a comparison object.
    
    X(i,j)        Effects: Same as above, but
                  uses Compare() as a
                  comparison object.
    
    X(il)         same as X(il.begin(), il.end())
    

    因此,效果相同,从初始化器列表构造时,顺序保证与插入一系列迭代器时相同。

    作为输入迭代器,范围不能 一般来说 重复顺序不对。