Utilice el contenedor de mapas desordenados de STL en C++

Jinku Hu 12 octubre 2023
  1. Utilice el elemento std::unordered_map para declarar un contenedor de mapa desordenado en C++
  2. Utilice la función de miembro contains para comprobar si el elemento dado existe en un mapa en C++
  3. Utilice la función de miembro erase para eliminar el elemento específico de un mapa en C++
  4. Utilice la función de miembro insert para agregar nuevos elementos a un mapa en C++
Utilice el contenedor de mapas desordenados de STL en C++

Este artículo explica varios métodos de cómo utilizar el contenedor STL unordered_map en C++.

Utilice el elemento std::unordered_map para declarar un contenedor de mapa desordenado en C++

El elemento std::unordered_map implementa un contenedor asociativo de pares clave-valor donde cada clave es única. A diferencia del std::map, el contenedor std::unordered_map no almacena los elementos en orden. Por lo tanto, el contenedor se utiliza principalmente para la búsqueda de elementos y la posición no importa. Además, no se garantiza que la posición de los elementos durante la vida útil del objeto sea fija. Por tanto, el programador debería tratar el orden como indefinido.

El siguiente ejemplo demuestra la inicialización de la lista del contenedor unordered_map y luego genera el contenido de ambos mapas. Tenga en cuenta que el orden descendente de los elementos m1 no implica que estén ordenados.

#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;
}

Producción :

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

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

Utilice la función de miembro contains para comprobar si el elemento dado existe en un mapa en C++

La función miembro contains ha sido parte del contenedor std::unordered_map desde la actualización de C++ 20. Puede usar la función para verificar si el elemento dado existe en el mapa. Este comando acepta el valor-clave como único argumento y devuelve true si se encuentra la clave. La función tiene el tiempo de ejecución promedio constante, siendo el peor de los casos el lineal dependiendo del tamaño del propio contenedor.

#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;
}

Producción :

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

Utilice la función de miembro erase para eliminar el elemento específico de un mapa en C++

Puede utilizar la función de miembro erase para eliminar el par clave-valor dado del mapa. La función tiene tres sobrecargas, la primera de las cuales lleva el iterador al elemento del mapa, que debe eliminarse del contenedor. La segunda sobrecarga de función toma dos iteradores para especificar el rango, que se eliminará del mapa. Tenga en cuenta que el rango dado debe ser válido dentro del objeto contenedor que realiza la llamada. La tercera sobrecarga puede tomar el valor clave del elemento que debe eliminarse.

En el siguiente ejemplo, eliminamos cada elemento que tiene un número par como valor clave.

#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;
}

Producción :

3 : grape;
1 : apple;

Utilice la función de miembro insert para agregar nuevos elementos a un mapa en C++

Otra función miembro principal del contenedor unordered_map es la función insert, que puede utilizar para agregar nuevos elementos al mapa. La función tiene múltiples sobrecargas, pero utilizamos la primera que solo toma un par clave-valor. Tenga en cuenta que también usamos la función std::make_pair para construir un nuevo par con los valores de los argumentos dados.

#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;
}

Producción :

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

Artículo relacionado - C++ Map