Verwendung von den STL Unordered Map Container in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie das Element std::unordered_map, um einen ungeordneten Kartencontainer in C++ zu deklarieren
  2. Verwenden Sie die Member-Funktion contains, um zu überprüfen, ob das angegebene Element in einer Map in C++ vorhanden ist
  3. Verwenden Sie die Member-Funktion erase, um das spezifische Element aus einer Map in C++ zu entfernen
  4. Verwenden Sie die Member-Funktion insert, um einer Map in C++ neue Elemente hinzuzufügen
Verwendung von den STL Unordered Map Container in C++

In diesem Artikel werden verschiedene Methoden zur Verwendung des STL-Containers unordered_map in C++ erläutert.

Verwenden Sie das Element std::unordered_map, um einen ungeordneten Kartencontainer in C++ zu deklarieren

Das Element std::unordered_map implementiert einen assoziativen Container von Schlüssel-Wert-Paaren, wobei jeder Schlüssel eindeutig ist. Im Gegensatz zum std::map speichert der Container std::unordered_map die Elemente nicht in sortierter Reihenfolge. Daher wird der Container hauptsächlich für die Elementsuche verwendet, und die Position spielt keine Rolle. Darüber hinaus ist die Position von Elementen über die Lebensdauer des Objekts nicht garantiert fest. Daher sollte der Programmierer die Reihenfolge als undefiniert behandeln.

Das folgende Beispiel demonstriert die Listeninitialisierung des Containers unordered_map und gibt dann den Inhalt beider Maps aus. Beachten Sie, dass die absteigende Reihenfolge der m1-Elemente nicht bedeutet, dass sie sortiert sind.

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
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::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  std::map<int, string> m2 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  printMap(m1);
  printMap(m2);

  return EXIT_SUCCESS;
}

Ausgabe:

4 : orange;
3 : grape;
2 : banana;
1 : apple;

1 : apple;
2 : banana;
3 : grape;
4 : orange;

Verwenden Sie die Member-Funktion contains, um zu überprüfen, ob das angegebene Element in einer Map in C++ vorhanden ist

Die Memberfunktion contains ist seit dem C++20-Update Teil des Containers std::unordered_map. Sie können die Funktion verwenden, um zu überprüfen, ob das angegebene Element in der Karte vorhanden ist. Dieser Befehl akzeptiert den Schlüsselwert als einziges Argument und gibt true zurück, wenn der Schlüssel gefunden wird. Die Funktion hat die konstante durchschnittliche Laufzeit, wobei der ungünstigste Fall der lineare ist, abhängig von der Größe des Containers selbst.

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
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::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  for (int x : {1, 2, 3, 4, 5}) {
    if (m1.contains(x)) {
      cout << x << ": Found\n";
    } else {
      cout << x << ": Not found\n";
    }
  }

  return EXIT_SUCCESS;
}

Ausgabe:

1: Found
2: Found
3: Found
4: Found
5: Not found

Verwenden Sie die Member-Funktion erase, um das spezifische Element aus einer Map in C++ zu entfernen

Sie können die Member-Funktion erase verwenden, um das angegebene Schlüssel-Wert-Paar aus der Karte zu entfernen. Die Funktion verfügt über drei Überladungen, von denen die erste den Iterator zum Kartenelement führt, das aus dem Container entfernt werden muss. Die zweite Funktionsüberladung benötigt zwei Iteratoren, um den Bereich anzugeben, der aus der Karte entfernt wird. Beachten Sie, dass der angegebene Bereich innerhalb des aufrufenden Containerobjekts gültig sein muss. Die dritte Überladung kann den Schlüsselwert des zu entfernenden Elements annehmen.

Im folgenden Beispiel entfernen wir jedes Element, das eine gerade Zahl als Schlüsselwert hat.

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
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::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  for (auto it = m1.begin(); it != m1.end();) {
    if (it->first % 2 == 0)
      it = m1.erase(it);
    else
      ++it;
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

Ausgabe:

3 : grape;
1 : apple;

Verwenden Sie die Member-Funktion insert, um einer Map in C++ neue Elemente hinzuzufügen

Eine weitere zentrale Memberfunktion des Containers unordered_map ist die Funktion insert, mit der Sie neue Elemente in die Map einfügen können. Die Funktion hat mehrere Überladungen, aber wir verwenden die erste, die nur ein Schlüssel-Wert-Paar benötigt. Beachten Sie, dass wir auch die Funktion std::make_pair verwenden, um ein neues Paar mit den angegebenen Argumentwerten zu konstruieren.

#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  vector<string> vec{"papaya", "olive", "melon"};

  auto count = 0;
  for (const auto& item : vec) {
    m1.insert(std::make_pair(count, item));
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

Ausgabe:

0 : papaya;
4 : orange;
3 : grape;
2 : banana;
1 : apple;
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