web-dev-qa-db-ja.com

ベクトルのマップに対するマルチマップの利点は何ですか?

ベクターのマップまたはセットのマップを作成できるのに、なぜマルチマップが存在するのか理解できません。私にとって唯一の違いは:

  • キーの要素を取得するためのマルチマップで_equal_range_を使用し、ベクトルのマップで_[]_演算子を使用して、要素のベクトルを作成します。
  • 要素を追加するためにマルチマップでmultimap.insert(make_pair(key,value))を使用し、ベクトルのマップでmap_of_vectors[key].Push_back(value)を使用します。

では、なぜマルチマップを使用するのですか?私にとって、キーのすべての値を取得するには、2つのイテレータよりも1つのベクトルを使用する方が適切です。

この質問は、ベクトルのunordered_mapおよびunordered_multimapにも適用されます。

71

同じキーを持つすべての値に、対応したい関係があるかどうかによって異なります。

たとえば、キーXを使用してすべての要素を処理したり、関数に渡したりすることがよくありますか?次に、それらを別のコンテナーに既に持っている方が便利です。直接アドレス指定できます。

ただし、アイテムのコレクションがある場合、同じキー値を共有するかどうかにかかわらず、間にベクターを使用するのはなぜですか?イテレータを使用してマルチマップを実行する方が、マップ、ベクターケースのforループをネストするよりも便利です。

別の見方:キーごとに複数のエントリが非常に一般的である場合、マップ、ベクトルの場合の構造の方が効率的です。それらがめったに起こらない場合、それは反対です。

50
ypnos

multimap<x, y>map<x, vector<y>>の間には多くの重要な違いがあります

値をmultimapに挿入すると、イテレータを削除するまで有効であり、これは非常に強力なプロパティであり、ベクトルのマップでは使用できません。

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b));

イテレータはマップから消去されるまで有効ですが、2番目のケースでは、ベクトルに新しいエントリを追加するたびに無効になります。

また、map<x, vector<y>>には既存のキーで空の値が設定されている場合がありますが、マルチマップには設定されていません。

これらは動作が異なるさまざまなものです。

また、正直に言うと、ライブラリでマルチマップを提供していない一部の言語ではマルチマップがありません。

49
Artyom