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