多图是否可以保证插入顺序与其初始值设定项中指定的元素顺序相符?

时间:2019-01-30 17:37:24

标签: c++ std c++17

如果我这样做:

#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 个答案:

答案 0 :(得分:4)

[associative.reqmts]

  

...我和j满足   输入迭代器要求,并引用隐式可转换为value_type的元素,[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())

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

作为输入迭代器,范围通常不能无序地迭代。