2010-12-14 3 views
54

ベクトルのマップやセットのマップを作成できるのであれば、なぜマルチマップが存在するのか分かりません。 は私にとって唯一の相違点は次のとおりです。キーの要素を取得するために、我々は単に[]演算子を使用して、要素のベクトルを持つベクトルのマップにマルチマップでequal_rangeを使用してマルチマップとベクトルマップの利点は何ですか?

  • 要素を追加するためにマルチマップでmultimap.insert(make_pair(key,value))を使用し、ベクトルのマップにmap_of_vectors[key].push_back(value)を使用してください。

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

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

+6

私は 'multimap'の目的をあまり理解していないことを認めなければなりません:/ –

+0

少し遅れてしまいますが、マルチマップは余分なポインタのためにベクトルのマップよりもはるかに多くのメモリを消費します。私がそれらを使用する唯一の理由は、各要素のキーを保持したい場合です。(push_backを実行すると、それを保持しません) – Jcao02

+0

異なる値の重複キーを追跡したいだけでなく、瞬間の通知でキー/値のペアを削除したい場合もあります。ベクトルのマップはそれには適していません。リストのマップを使用することはできますが、マルチマップを使用する方が便利です。 – richizy

答えて

42

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

たとえば、キーXですべての要素を調べたり、関数に渡したりするなどしますか?それでは、すでに別々の容器に入れておくと、直接扱う方が便利です。

ただし、同じキー値を共有するアイテムのコレクションを持っているかどうか、その間にベクターを使用する理由は何ですか?イテレータを使用してマルチマップを実行する方が、マップのベクトルケースのネストされたforループを持つ方が便利です。

これを調べるもう1つの方法:キーごとに複数のエントリが非常に一般的な場合、構造はマップのベクトルケースで効率的です。彼らがめったに起きなければ、それは逆です。

+2

ありがとうございました。あなたとArtyomの答えは私にもう少し違いを示しました。しかし、私はまだマルチマップがベクトルのマップとして実生活において有用であるとは考えていません。しかしそれは私の個人的な意見です;) –

-1

2つのイテレータ私はあなたが間違っていると思う。

マルチマップ上でstd :: for_each()やその他のアルゴリズムを使用する場合は、1つのイテレータ範囲しか使用しません。各キーのベクトルで心配するよりもずっと簡単です。

40

multimap<x, y>map<x, vector<y>>

の間に多くの重要な違いは、あなたがマルチマップに値を挿入したら、あなたはそれを削除し、これは非常に強力な財産になるまでイテレータはあなたができる、 有効なままであろうことを知っているがありますベクトル地図を持っています。

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

後者の場合、 には、それはあなたがベクトルに新しいエントリを追加するたびに無効化されるだろうが、それは、マップから消去されるまで、反復子が有効であり続けます。

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

これらは異なる動作をします。

そして、正直言って私はマルチマップをライブラリで提供していないいくつかの言語では見逃しています。

関連する問題