我很好奇这种行为。我发现,分配一个unordered_map
改变无序地图的内部顺序,而没有任何插入/缺失:unordered_map更改的顺序
unordered_map<int, string> m1;
unordered_map<int, string> m2;
unordered_map<int, string> m3;
m1[2] = "john";
m1[4] = "sarah";
m1[1] = "mark";
m2 = m1;
m3 = m2;
for(auto it = m1.begin(); it != m1.end(); ++it) {
cout << it->second << " ";
}
cout << endl;
for(auto it = m2.begin(); it != m2.end(); ++it) {
cout << it->second << " ";
}
cout << endl;
for(auto it = m3.begin(); it != m3.end(); ++it) {
cout << it->second << " ";
}
cout << endl;
输出:
mark sarah john
john sarah mark
mark sarah john
我知道有不能维持上的任何特定的顺序unordered_map
由于内部是一个哈希表,因此元素插入可以在任何地方结束,重新哈希将混合它。
但是,这里的顺序在分配后才发生变化。我预计订单是一样的,因为我认为它只是复制底层存储。
我认为的第一个解释是,也许unordered_map
正在利用副本将新地图重新散列为更优化的安排。但是,我尝试在m2上重新分配新地图(m3),m2的顺序不保留为m3。
为什么分配地图会改变顺序?
我的编译器是苹果LLVM版本8.1.0(铛-802.0.42)
我喜欢你认识到没有内部o的部分一个*无序*地图....然后仍然奇怪为什么订单不一致 – CoryKramer
@CoryKramer这是一个很好的问题,但。问题是为什么后备存储未被复制*原样*;为什么重新安排? – Justin
@Justin如果答案只是“支持存储是实现定义的,因此没有人能给你一个比随机猜测或实现具体细节更好的答案”我们应该如何处理这些信息? – CoryKramer