2010-12-14 11 views
54

Ich verstehe nicht, warum Multimap existiert, wenn wir eine Karte von Vektoren oder eine Karte von Sätzen erstellen können. Für mich nur Unterschiede sind:Was ist der Vorteil von Multimap gegenüber Vektoren?

  • mit equal_range in multimap für Elemente eines Schlüssels und in der Karte von Vektoren bekommen wir einfach [] Operator verwenden und Vektor-Elemente.
  • mit multimap.insert(make_pair(key,value)) in Multimap zum Hinzufügen von Elementen und map_of_vectors[key].push_back(value) in der Vektorkarte.

Warum also Multimap verwenden? Für mich ist es besser, einen Vektor als zwei Iteratoren zu haben, um alle Werte eines Schlüssels zu erhalten.

Diese Frage gilt auch für unordered_map von Vektoren und unordered_multimap.

+6

Ich muss zugeben, ich habe den Zweck von 'multimap' nie verstanden:/ –

+0

Ich etwas spät in der Frage, aber auch Multimap verbraucht viel mehr Speicher als die Karte der Vektoren aufgrund der extra Zeiger.Der einzige Grund, warum ich sie verwende, ist, wenn ich den Schlüssel jedes Elements behalten möchte (indem ich 'push_back' drücke, wird es nicht beibehalten). – Jcao02

+0

Multimap ist großartig, wenn du nicht nur doppelte Schlüssel mit unterschiedlichen Werten verfolgen willst, Sie möchten aber auch jedes Schlüssel/Wert-Paar auf einen Blick löschen. Eine Karte von Vektoren ist dafür nicht geeignet, und während Sie eine Liste von Listen verwenden können, ist es bequemer, einfach eine Multimap zu verwenden. – richizy

Antwort

42

Ich würde sagen, es hängt davon ab, ob alle Werte mit dem gleichen Schlüssel eine Beziehung haben, die Sie ansprechen möchten.

Also zum Beispiel, gehen Sie oft durch alle Elemente mit Schlüssel X, oder übergeben Sie sie an eine Funktion, und so weiter? Dann ist es bequemer, sie bereits in ihrem separaten Container zu haben, den Sie direkt adressieren können.

Wenn Sie jedoch nur eine Sammlung von Elementen haben, die denselben Schlüsselwert haben oder nicht, warum sollten Vektoren dazwischen verwendet werden? Es ist bequemer, mit Iteratoren durch die Multimap zu gehen, als eine verschachtelte for-Schleife für den Vektor der Karte zu haben.

Eine andere Möglichkeit, dies zu betrachten: Wenn mehrere Einträge pro Schlüssel sehr üblich sind, ist Ihre Struktur in der Map, Vektorfall, effizienter. Wenn sie selten passieren, ist es das Gegenteil.

+2

Danke. Deine und Artyoms Antwort zeigte mir ein bisschen mehr Unterschiede. Dennoch glaube ich nicht, dass Multimap im realen Leben so nützlich ist wie eine Vektorkarte. Aber das ist meine persönliche Meinung;) –

-1

zwei Iteratoren ??? Ich denke du liegst falsch.

wenn ich std :: for_each() oder andere Algo von auf einem Multimap verwende ich nur einen Iterator-Bereich, und es ist verdammt viel einfacher, dass Sorgen mit einem Vektor für jede Taste.

40

Es gibt viele wichtige Unterschiede zwischen multimap<x, y> und map<x, vector<y>>

Sobald Sie einen Wert in multimap eingeführt hatte, wissen Sie, dass der Iterator gültig bleiben würde, bis Sie ihn entfernen, und das ist sehr starke Eigenschaft, können Sie Hab 'es nicht mit einer Vektorkarte.

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

Der Iterator bleibt gültig, bis sie von der Karte gelöscht wird, während im zweiten Fall würde es jedes Mal für ungültig erklärt werden Sie den Vektor neuen Eintrag hinzuzufügen.

Beachten Sie auch, dass map<x, vector<y>> möglicherweise einen leeren Wert mit vorhandenen Schlüssel gesetzt haben, während Multi-Map nicht.

Dies sind verschiedene Dinge, die sich unterschiedlich verhalten.

Und um ehrlich zu sein, vermisse ich multimap in einigen Sprachen, die es nicht in ihrer Bibliothek bereitstellen.

Verwandte Themen