我很好奇這種行爲。我發現,分配一個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