【发布时间】:2018-01-19 01:47:24
【问题描述】:
我很好奇这种行为。我发现分配一个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) 上重复分配,而 m3 中没有保留 m2 的顺序。
为什么分配地图会改变顺序?
我的编译器是 Apple LLVM 版本 8.1.0 (clang-802.0.42)
【问题讨论】:
-
我喜欢你认识到 unordered 地图没有内部顺序的部分......然后仍然想知道为什么顺序不一致
-
@CoryKramer 不过,这是一个很好的问题。问题是为什么没有按原样复制后备存储;为什么要重新排列?
-
@CoryKramer 是的,我知道这是根据标准的答案。但是 OP 的问题是关于 为什么 它是以这种方式实现的。即使这是特定于实现的细节,这也是一个好问题(对于 SO 来说可能不是一个好问题,但这是一个好问题)
-
你使用的是什么实现。 this 给出“预期”结果
-
@GonzaloSolera 如果你添加一个
m4添加assignm3到它m4看起来像m2?
标签: c++ dictionary unordered-map