Einfügen neuer Elemente in eine STL-Zuordnung in C++
-
Verwenden Sie die Member-Funktion
insert
, um ein neues Element zustd::map
in C++ hinzuzufügen -
Verwenden Sie die Member-Funktion
insert_or_assign
, um ein neues Element zustd::map
in C++ hinzuzufügen -
Verwenden Sie die Member-Funktion
emplace
, um ein neues Element zustd::map
in C++ hinzuzufügen -
Verwenden Sie die Member-Funktion
emplace_hint
, um ein neues Element zustd::map
in C++ hinzuzufügen
In diesem Artikel werden mehrere Methoden zum Hinzufügen neuer Elemente zum Objekt std::map
in C++ erklärt.
Verwenden Sie die Member-Funktion insert
, um ein neues Element zu std::map
in C++ hinzuzufügen
Der STL-Container map
bietet eine Datenstruktur zum Speichern von Schlüssel-Wert-Paaren als Elemente, die beim Einfügen oder Initialisieren automatisch sortiert werden. Neue Elemente können einem std::map
-Objekt mit mehreren Methoden hinzugefügt werden, von denen die gängigste die Funktion insert
ist.
Die Memberfunktion insert
hat mehrere Überladungen. Dennoch benötigt die einfachste nur ein einziges Argument, das die const
-Referenz auf das eingefügte Objekt angibt. Eine andere Überladung kann einen r-Wert-Verweis akzeptieren und den Befehl std::forward
verwenden, um ein Element direkt zu erstellen, wie im folgenden Beispielcode gezeigt.
Die letztere Überladung gibt ein Paar des Iterators zum eingefügten Element und den Wert bool
zurück, was eine erfolgreiche Einfügung anzeigt. Wir demonstrieren auch eine Überladung der Funktion insert
, die eine Liste von Schlüsselwerten ähnlich der Initialisiererliste nimmt und Elemente aus den Werten konstruiert. Diese Überladung hat jedoch keinen Rückgabetyp.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.insert({"k", "ktop"});
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << "\n";
m1.insert({{"k", "ktop"}, {"p", "ptop"}});
printMap(m1);
return EXIT_SUCCESS;
}
Ausgabe:
Not Inserted
h : htop;
k : ktop;
p : ptop;
Verwenden Sie die Member-Funktion insert_or_assign
, um ein neues Element zu std::map
in C++ hinzuzufügen
Der neuere C++17-Standard bietet eine Member-Funktion namens insert_or_assign
, die ein neues Element in eine Map einfügt, wenn der angegebene Schlüssel noch nicht existiert. Andernfalls weist die Funktion dem Element mit dem vorhandenen Schlüssel den neuen Wert zu.
Die Funktion verfügt über mehrere Überladungen, aber die im folgenden Beispiel aufgerufene verwendet zwei Argumente als R-Wert-Referenzen auf einen Schlüssel und einen Wert. Diese Überladung gibt auch ein Iteratorpaar und einen bool
-Wert zurück. Beachten Sie, dass wir den Status der Einfügung mit einem bedingten Operator überprüfen und die entsprechenden Meldungen ausgeben.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.insert_or_assign("p", "ptop");
ret.second ? cout << "Inserted" : cout << "Assigned";
cout << "\n";
ret = m1.insert_or_assign("t", "ttop");
ret.second ? cout << "Inserted" : cout << "Assigned";
cout << "\n";
printMap(m1);
return EXIT_SUCCESS;
}
Ausgabe:
Inserted
Inserted
h : htop;
k : ktop;
p : ptop;
t : ttop;
Verwenden Sie die Member-Funktion emplace
, um ein neues Element zu std::map
in C++ hinzuzufügen
Eine weitere Memberfunktion, die mit dem Container std::map
bereitgestellt wird, ist emplace
. Diese Funktion bietet im Gegensatz zur Funktion insert
Effizienz, da das Kopieren der Argumentwerte nicht erforderlich ist. Im Gegenteil, die Funktion emplace
konstruiert das Element direkt, was bedeutet, dass die angegebenen Parameter an den Klassenkonstruktor weitergegeben werden. Beachten Sie, dass abhängig von den Argumenten der entsprechende Konstruktor aufgerufen wird.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.emplace("t", "ttop");
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << endl;
ret = m1.emplace(std::make_pair("t", "ttop"));
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << endl;
printMap(m1);
return EXIT_SUCCESS;
}
Ausgabe:
Inserted
Not Inserted
h : htop;
k : ktop;
t : ttop;
Verwenden Sie die Member-Funktion emplace_hint
, um ein neues Element zu std::map
in C++ hinzuzufügen
Alternativ kann man die Member-Funktion emplace_hint
verwenden, um ein neues Element mit einem zusätzlichen Parameter namens hint
in eine Map einzufügen, der eine Position angibt, an der die Suche beginnen soll. Es würde einen Iterator an das neu eingefügte Element zurückgeben, wenn der Prozess erfolgreich war. Andernfalls wird der Iterator zum vorhandenen Element mit demselben Schlüssel zurückgegeben.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");
m1.emplace_hint(ret, "m", "mtop");
m1.emplace_hint(m1.begin(), "p", "ptop");
printMap(m1);
return EXIT_SUCCESS;
}
Ausgabe:
h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook