85

ベクトルのマップまたはセットのマップを作成できる場合、マルチマップが存在する理由がわかりません。私にとって唯一の違いは次のとおりです。

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

では、なぜマルチマップを使用するのでしょうか。私にとっては、キーのすべての値を取得するには、2 つの反復子よりもベクトルを使用する方が適切です。

この質問は、ベクトルの unordered_map と unordered_multimap にも当てはまります。

4

2 に答える 2

65

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

たとえば、キー X を持つすべての要素をよく調べたり、それらを関数に渡したりしますか? 次に、直接アドレス指定できる別のコンテナーに既にそれらを入れておくと便利です。

ただし、同じキー値を共有するかどうかに関係なくアイテムのコレクションがある場合、その間にベクトルを使用する必要はありません。マップのネストされた for ループを持つベクトルの場合よりも、反復子を使用してマルチマップを実行する方が便利です。

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

于 2010-12-14T10:07:08.100 に答える
61

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

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

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

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

map<x, vector<y>>また、既存のキーに空の値が設定されている可能性がありますが、マルチマップには設定されていないことに注意してください。

これらは、異なる動作をする異なるものです。

正直なところ、ライブラリで提供されていない一部の言語では multimap が恋しいです。

于 2010-12-14T12:34:24.550 に答える