この動作が不思議です。割り当て時に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
Iは上で維持任意の特定の順序がないことを知っている私はunordered_map
を割り当てることは、任意の挿入/削除することなく、無秩序マップの内部順序を変更することを見出しましたunordered_map
は、内部的にはハッシュテーブルなので、要素の挿入はどこでも終了でき、再ハッシュはすべてそれを混合します。
ただし、ここでの割り当ては割り当ての直後に変更されています。私は基本的なストレージをコピーすると思っていたので、その順序は同じであると思った。
私が考えた最初の説明は、おそらくunordered_map
がコピーを利用して、新しいマップをより最適な配置に再ハッシュしているということでした。しかし、私はm2から新しいマップ(m3)に代入を繰り返してみましたが、m2の順序はm3に保存されていません。
なぜ地図を割り当てると注文が変わるのですか?明らかにこれは実装固有であるので
私のコンパイラは(それはすべての後に順不同マップである)のApple LLVMバージョン8.1.0(打ち鳴らす-802.0.42)
私はあなたが内部のoがないことを認識する部分が好きです順序がそろっていないのはまだ不思議です – CoryKramer
@CoryKramerしかし、良い質問です。問題は、バッキングストレージがそのままコピーされないことです*。それはなぜ再配置されますか? – Justin
@Justinと答えは単純であれば、我々はその情報をどうすべきか「バッキングストレージがある実装では、したがって、誰があなたにランダムな推測や実装具体的な詳細より良い答えを与えることはできない定義されましたか」? – CoryKramer