Einfügen neuer Elemente in eine STL-Zuordnung in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Member-Funktion insert, um ein neues Element zu std::map in C++ hinzuzufügen
  2. Verwenden Sie die Member-Funktion insert_or_assign, um ein neues Element zu std::map in C++ hinzuzufügen
  3. Verwenden Sie die Member-Funktion emplace, um ein neues Element zu std::map in C++ hinzuzufügen
  4. Verwenden Sie die Member-Funktion emplace_hint, um ein neues Element zu std::map in C++ hinzuzufügen
Einfügen neuer Elemente in eine STL-Zuordnung in C++

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;
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ Map