4

次のコードがある場合

std::unordered_multimap<std::string, std::vector<double>> myMap;
std::vector<double> v1, v2, v3;
// init v1, v2, v3....
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v1));
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v2));
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v3));

イテレータで値にアクセスすると、常に次の順序になります。v1, v2, v3

基本的に、同じキーで異なる値の要素を挿入すると、常に挿入の順序が保持されますか?

4

3 に答える 3

7

これは実装固有のものだと思います。実装がバケット ハッシュ マップの場合、同じキーを持つunordered_multimap要素は同じバケットに格納されます。この場合、それらは同じ挿入順序になる可能性があります (これはおそらくあなたの状況です)。

しかし、unordered_mapたとえば、オープン アドレッシング技術を使用した実装では、順序が変わる可能性があります。フード実装の下で異なるものを使用するSTL実装があるかどうかはわかりませんが、クラスの契約は同じキーの値の順序について何の仮定もしていないので、あなたはそれを取ることができないと思います承諾する。

ここから撮影:

内部的には、unordered_map の要素は、キーまたはマップされた値に関して特定の順序でソートされていません。

于 2013-01-15T20:37:24.160 に答える
4

名前の「順不同」の要点は、順序に依存できないということです。これまで。

コンテナの繰り返しによる順序が検出された場合、それは偶然または実装の成果物です。決して当てにしてはいけません

于 2013-01-15T20:37:33.520 に答える
3

ドキュメントに、常に挿入順に返されると記載されていない限り、それに依存するのは間違っています。現在使用している STL 実装は変更される可能性があります。また、マップに多くのエントリがある場合、使用している実装が異なる動作をする場合もあります。

于 2013-01-15T20:38:00.057 に答える