В одной книге упоминалось, что для std::unordered_multimap
:
Порядок элементов не определен. Единственная гарантия состоит в том, что дубликаты, которые возможны из-за использования мультимножества, группируются вместе в порядке их вставки.
Но из вывода приведенного ниже примера мы видим, что порядок печати обратный их вставке.
#include <string>
#include <unordered_map>
int main()
{
std::unordered_multimap<int, std::string> um;
um.insert( {1,"hello1.1"} );
um.insert( {1,"hello1.2"} );
um.insert( {1,"hello1.3"} );
for (auto &a: um){
cout << a.first << '\t' << a.second << endl;
}
}
Что при компиляции и запуске дает этот вывод (g++ 5.4.0):
1 hello1.3
1 hello1.2
1 hello1.1
обновлено: у unordered_multiset та же проблема:
auto cmp = [](const pair<int,string> &p1, const pair<int,string> &p2)
{return p1.first == p2.first;};
auto hs = [](const pair<int,string> &p1){return std::hash<int>()(p1.first);};
unordered_multiset<pair<int, string>, decltype(hs), decltype(cmp)> us(0, hs, cmp);
us.insert({1,"hello1.1"});
us.insert({1,"hello1.2"});
us.insert({1,"hello1.3"});
for(auto &a:us){
cout<<a.first<<"\t"<<a.second<<endl;
}
выход:
1 hello1.3
1 hello1.2
1 hello1.1
The order of the elements is undefined.
Думаю, вам нужно понять, что Стандарт имеет в виду, когда говорит, что не определено: может случиться что угодно, но не важно, что произойдет, и никто не должен полагаться на то, что может произойти во вторник, с ветром, дующим на восток. Реализации могут определять порядок, если они хотят - вероятно, как побочный эффект непреднамеренного византизма - но Стандарт этого не делает. Это все. Сказав это, если бы вы вставили больше элементов, вы, вероятно, обнаружили бы, что «предсказуемый» порядок начал разрушаться. Но опять же, это совершенно неважно. Этоunordered_map
. - person underscore_d   schedule 17.07.2016unordered_multimap
, для которого черновик C++ от 14 ноября 2014 года (по крайней мере) требует, чтобы элементы с эквивалентными ключами располагались рядом друг с другом в порядке итерации контейнера, и чтобы перефразирование сохраняло относительный порядок эквивалентных элементы (23.2.5). Я ничего не могу найти об относительном порядке, определяемом в соответствии с порядком вставки, но это стоит знать. - person Ry-♦   schedule 17.07.2016multi
. Теперь нам нужно знать, в какой книге это сказано, а не в том, что она будет надежнее Стандарта! - person underscore_d   schedule 17.07.2016