一本书提到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