std::multimap と std::unordered_multimap はどのくらいの頻度でエントリをシャッフルしますか? 私のコードは、同じハッシュを持つエントリを区別するために参照を渡します。参照リダイレクト機能を実行するタイミングを知りたいのです。
これを行うとどうなりますか:
std::multimap atable; //Type specification stuff left out //Code that pus in two entries with the same key, call that key foo int bar = atable[foo];
代わりに unordered_multimap の場合、結果は異なりますか?
同じハッシュを持つエントリを区別するために参照を渡すことに戻ります。それを行うより安全な方法はありますか?
エントリの 1 つを削除すると、エントリは移動しますか (これは、std::vector のドキュメントを読んで示唆されていることです)。
3 に答える
std::multimap と std::unordered_multimap はどのくらいの頻度でエントリをシャッフルしますか?
一度もない。連想コンテナー (セット、マップ、およびそれらの順不同または「マルチ」バージョンを含む) の要素を指す反復子は、決して無効化されません (それらが指す特定の要素が削除されない限り)。つまり、実際の要素が「シャッフル」されることはありません。これらは、リンクされた構造 (リンク ツリーなど) として実装する必要があります。つまり、要素を物理的に移動することなく、いくつかのポインターを変更するだけで再構築できます。
編集: どうやら (TemplateRex のコメントを参照)、これは順序付けられていないコンテナーには当てはまりません。その場合、反復子は無効になる可能性がありますが、要素自体は移動しません。これらの要件は、バック ポインターのない間接コンテナーを意味します。これは合理的な選択だと思いますが、期待していたものではありません。
これを行うとどうなりますか: ... (
[]
マルチマップの取得) ...
は(または順不同のバージョン)operator[]
に対して定義されていません。std::multimap
それで、何が起こるでしょうか?コンパイルエラーが発生します。
代わりに unordered_multimap の場合、結果は異なりますか?
いいえ、同じoperator[]
です。存在しません。
同じハッシュを持つエントリを区別するために参照を渡すことに戻ります。それを行うより安全な方法はありますか?
はい、推奨される方法は、参照ではなくイテレータを使用してマップ/セット/何でも参照することです。要素への反復子は有効なままであることが保証され、コピー可能であり、適切な const-ness 保護を備えているため、「エントリを参照する」のに最適なオブジェクトになります。
編集:同じコメントによると、ハッシュされたコンテナー (順序付けられていないコンテナー) を扱う場合は、要素へのポインターを使用することをお勧めする必要があります。