Гарантирует ли multimap, что порядок вставки соответствует порядку элементов, заданному в его инициализаторе? - PullRequest
0 голосов
/ 30 января 2019

Если я сделаю это:

#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 с составным ключом, но у меня есть тысячи таких вещей, управляемых общим интерфейсом, и только некоторые из них содержат дубликаты ключей, поэтому я не решаюсь представить эту сложность в целом.)

1 Ответ

0 голосов
/ 30 января 2019

[associative.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())

Таким образом, при одинаковых эффектах гарантии упорядочения одинаковы при построении из списка инициализатора, так как онинаходятся при вставке диапазона итераторов.

Будучи входными итераторами, диапазон не может в общем быть итеративным вне последовательности.

...