Ich verstehe nicht, warum Multimap existiert, wenn wir eine Karte von Vektoren oder eine Karte von Mengen erstellen können. Für mich sind nur Unterschiede:
- Verwendung
equal_range
in multimap für Elemente eines Schlüssels und in der Karte von Vektoren bekommen wir einfach nutzen[]
Operator und Vektor von Elementen haben. - Verwendung
multimap.insert(make_pair(key,value))
in Multimap zum Hinzufügen von Elementen undmap_of_vectors[key].push_back(value)
in der Karte von Vektoren.
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.
multimap
: /push_back
Sie ihn nicht behalten)map<K, V>
vs. gesagt werden,set<pair<K, V>, cmp_first<K, V>>
wo cmp_first das.first
Mitglied vergleicht .Antworten:
Ich würde sagen, es hängt davon ab, ob alle Werte mit demselben Schlüssel eine Beziehung haben, die Sie ansprechen möchten.
Gehen Sie beispielsweise häufig alle Elemente mit der Taste X durch oder übergeben Sie sie an eine Funktion usw. Dann ist es bequemer, sie bereits in einem separaten Container zu haben, den Sie direkt ansprechen können.
Wenn Sie jedoch nur eine Sammlung von Elementen haben, die möglicherweise denselben Schlüsselwert haben oder nicht, warum sollten Sie dazwischen Vektoren verwenden? Es ist bequemer, die Multimap mit Iteratoren zu durchlaufen, als eine verschachtelte for-Schleife für die Karte, Vektorfall.
Eine andere Sichtweise: Wenn mehrere Einträge pro Schlüssel sehr häufig sind, ist Ihre Struktur im Karten- und Vektorfall effizienter. Wenn sie selten vorkommen, ist es das Gegenteil.
quelle
multimap
Sie können einen Iteratorbereich haben, der die gesamte Struktur abdeckt, aber solche Anfangs- / Enditeratoren iterieren Schlüssel- und Wertepaare (was möglicherweise nicht bequem ist). Mit dermap<...,vector>
Iteration ist die gesamte Struktur komplexer, aber Sie können Anfangs- / Enditeratoren mit gleicher Folge von nur Werten haben.Es gibt viele wichtige Unterschiede zwischen
multimap<x, y>
undmap<x, vector<y>>
Nachdem Sie einen Wert in Multimap eingefügt haben , wissen Sie, dass der Iterator gültig bleibt, bis Sie ihn entfernen. Dies ist eine sehr starke Eigenschaft. Sie können ihn nicht mit einer Karte von Vektoren haben.
multimap<x,y>::iterator p=mymap.insert(make_pair(a,b));
Der Iterator bleibt gültig, bis er aus der Karte gelöscht wird. Im zweiten Fall wird er jedes Mal ungültig, wenn Sie dem Vektor einen neuen Eintrag hinzufügen.
Beachten Sie auch, dass
map<x, vector<y>>
möglicherweise ein leerer Wert mit dem vorhandenen Schlüssel festgelegt ist, Multimap jedoch 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.
quelle