Ich fand heraus, dass sie einen Schlüssel und mehrere Werte haben, was einzigartig ist.
Antworten:
Die Multimap speichert Paare von (Schlüssel, Wert), wobei sowohl Schlüssel als auch Wert mehrmals vorkommen können.
Der map<key, set<value>>
Wert wird nur einmal für einen bestimmten Schlüssel gespeichert. Dazu muss es in der Lage sein, die Werte zu vergleichen, nicht nur die Schlüssel.
Es hängt von Ihrer Anwendung ab, ob die vergleichbaren Werte gleichwertig sind oder ob Sie sie trotzdem separat speichern möchten. Vielleicht enthalten sie Felder, die unterschiedlich sind, aber nicht am Vergleich für die Menge teilnehmen.
std::multimap<key, value>
lässt zu , dass derselbe Schlüssel mehrmals angezeigt wird std::map<key, whatever>
, während die Eindeutigkeit von erforderlich ist key
.
A std::map
ist ein assoziativer Container, mit dem Sie Ihrem Typwert einen eindeutigen Schlüssel zuordnen können. Beispielsweise,
void someFunction()
{
typedef std::map<std::string, int> MapType;
MapType myMap;
// insertion
myMap.insert(MapType::value_type("test", 42));
myMap.insert(MapType::value_type("other-test", 0));
// search
auto it = myMap.find("test");
if (it != myMap.end())
std::cout << "value for " << it->first << " is " << it->second << std::endl;
else
std::cout << "value not found" << std::endl;
}
A std::multimap
ist gleich a std::map
, aber Ihre Schlüssel sind nicht mehr eindeutig. Daher können Sie eine Reihe von Artikeln finden, anstatt nur einen einzigen Artikel zu finden. Beispielsweise,
void someFunction()
{
typedef std::multimap<std::string, int> MapType;
MapType myMap;
// insertion
myMap.insert(MapType::value_type("test", 42));
myMap.insert(MapType::value_type("test", 45));
myMap.insert(MapType::value_type("other-test", 0));
// search
std::pair<auto first, auto second> range = myMap.equal_range("test");
for (auto it = range.first; it != range.second; ++it)
std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}
Das std::set
ist wie ein std::map
, speichert jedoch keinen Schlüssel, der einem Wert zugeordnet ist. Es speichert nur den Schlüsseltyp und stellt sicher, dass er innerhalb des Satzes eindeutig ist.
Sie haben auch die std::multiset
, die dem gleichen Muster folgt.
Alle diese Container bieten einen O-Zugriff (log (n)) mit ihrem find / equal_range.
std::pair<auto first, auto second> range = myMap.equal_range("test");
nicht, weil error: 'auto' not allowed in template argument
. Verwenden Sie const auto range = myMap.equal_range("test")
stattdessen.
map::insert
Da map
Container keine doppelten Schlüsselwerte zulassen, prüft die Einfügeoperation für jedes eingefügte Element, ob bereits ein anderes Element mit demselben Schlüsselwert im Container vorhanden ist. In diesem Fall wird das Element nicht eingefügt und sein zugeordneter Wert wird in keiner Weise geändert.
andererseits
multimap::insert
kann beliebig viele Elemente mit demselben Schlüssel einfügen.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
Letzteres erfordert, dass die Werte geordnet werden können (entweder über operator<
oder eine Vergleichsfunktion), Ersteres nicht.
T
, der keine Bestellung enthält. Sie können es verwenden, um ein zu erstellen std::multimap<U, T>
, aber Sie können es nicht verwenden, um ein zu erstellen std::map<U, std::set<T> >
.