多重映射是否保证广告顺序与其初始值设定项中给出的元素顺序匹配

Does multimap guarantee that insertion order matches the order of elements given in its initializer?

本文关键字:顺序 元素 是否 映射      更新时间:2023-10-16

如果我这样做:

#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';
}

然后,从 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';
}

我们是否保证"广告顺序"与初始化器中元素的顺序匹配?

快速测试给出了令人鼓舞的结果,但并不能真正证明任何事情。

我正在写C++17。

(我可以使用复合键切换到std::map,但我有数千个由通用接口管理的东西,只有少数包含重复键,所以我对引入整体复杂性犹豫不决。

[associaciative.reqmts]:

。i 和 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())

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

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

相关文章: