Mapa en C++ Biblioteca de plantillas estándar (STL)

⚡ Resumen inteligente

Mapa en C++ Es un contenedor asociativo de la biblioteca de plantillas estándar que almacena elementos como pares clave-valor ordenados, donde cada clave única se corresponde con un valor y permite una búsqueda, inserción y recorrido ordenado rápidos.

  • 🗺️ Contenedor asociativo: A C++ El mapa almacena los elementos como pares clave-valor con claves únicas y ordenadas automáticamente.
  • 🧩 Encabezado y sintaxis: Incluya el encabezado del mapa y luego declare std::map. nombre para almacenar pares tipados.
  • 🛠️ Funciones integradas: Las funciones begin(), size(), empty(), insert(), find(), erase() y clear() gestionan el contenido del mapa.
  • 🔄 Iteración: Un iterador bidireccional recorre los elementos del mapa en orden de clave para su lectura o eliminación.
  • 🔑 Claves únicas: Dos elementos no pueden compartir una clave, lo que hace que un mapa sea ideal como arreglo asociativo.
  • 🤖 Asistencia de IA: GitHub Copilot y asistentes de IA similares generan declaraciones de mapas y bucles a partir de un comentario breve.

Mapa en C++ STL

¿Qué es el mapa? C++?

In C++Un mapa es un contenedor asociativo que almacena elementos en forma mapeada. Cada elemento del mapa se compone de una clave y un valor mapeado. Dos valores mapeados no pueden tener la misma clave.

Los valores clave son útiles para ordenar e identificar elementos de forma única, mientras que los valores mapeados almacenan el contenido asociado a cada clave. Ambos pueden ser de diferente tipo, pero el tipo de miembro los combina en un par que los contiene a ambos.

Antes de escribir cualquier código, es útil saber por qué un mapa suele ser el contenedor adecuado.

¿Por qué utilizar std::map?

Estas son algunas razones para usar un mapa:

  • std::map almacena únicamente claves únicas, ordenadas según el criterio de ordenación elegido.
  • Es fácil y rápido buscar elementos utilizando la clave.
  • Solo se adjunta un elemento a cada llave.
  • std::map se puede utilizar como una matriz asociativa.
  • std::map se puede implementar utilizando árboles binarios balanceados.

Para aprovechar estas ventajas, comience con la sintaxis de declaración.

Sintaxis

Para declarar std::map, use esta sintaxis:

std::map<key_datatype, value_datatype>map_name; 
  • El tipo_de_dato_clave denota el tipo de datos de las claves del mapa.
  • El tipo_de_dato_valor denota el tipo de datos de los valores correspondientes a las claves del mapa.
  • El nombre_mapa es el nombre del mapa.

Por ejemplo:

map<string, int> my_map; 

Hemos declarado un mapa llamado my_map. El mapa tendrá una cadena de caracteres como tipo de dato para las claves y un número entero como tipo de dato para los valores.

Tipos de miembros

Las funciones miembro pueden utilizar los siguientes tipos de miembros como parámetros o como tipo de retorno:

  • tipo_clave: Clave (el primer parámetro de la plantilla)
  • tipo_mapeado: T (el segundo parámetro de la plantilla)
  • comparación_clave: Comparar (el tercer parámetro de la plantilla)
  • tipo_asignador: Asignación (el cuarto parámetro de la plantilla)
  • tipo de valor: par
  • valor_comparar: Clase de función anidada para comparar elementos
  • referencia: tipo_asignador::referencia
  • referencia_const: tipo_asignador::referencia_const
  • puntero: tipo_asignador::puntero
  • puntero_const: tipo_asignador::const_pointer
  • iterador: un iterador bidireccional para value_type
  • constante_iterador: un iterador bidireccional al valor_tipo constante
  • iterador_inverso: un iterador inverso
  • const_reverse_iterator: un iterador inverso constante
  • tipo_diferencia: ptrdiff_t
  • tipo de letra: tamaño_t

Funciones integradas de std::map

std::map viene con funciones incorporadas. Algunos de estos incluyen:

  • comenzar() – Esta función devuelve el iterador al primer elemento del mapa.
  • Talla() – Esta función devuelve el número de elementos en un mapa.
  • vacío() – Esta función devuelve un valor booleano que indica si un mapa está vacío.
  • insertar(par(clave, valor)) – Esta función inserta un nuevo par clave-valor en un mapa.
  • encontrar(valor) – Esta función devuelve el iterador al elemento val si se encuentra. De lo contrario, devuelve m.end().
  • borrar(posición del iterador) – Esta función elimina el elemento en la posición a la que apunta el iterador.
  • borrar (const g) – Esta función elimina el par clave-valor g de un mapa.
  • claro() – Esta función elimina todos los elementos de un mapa.

Una vez definidas las funciones, los siguientes ejemplos las ponen en práctica, comenzando con la iteración.

Iterando sobre elementos del mapa

Puedes iterar sobre los elementos del mapa. Simplemente necesitamos crear un iterador y usarlo para ello. Por ejemplo:

Ejemplo

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

Salida:

C++ Ejemplo de iteración de mapa 1 salida

Aquí hay una captura de pantalla del código:

C++ Ejemplo de iteración de mapa 1 código

Code Explicación:

  1. Incluya el archivo de encabezado iostream en nuestro código para usar sus funciones.
  2. Incluya el archivo de encabezado de cadena en nuestro código para usar sus funciones.
  3. Incluya el archivo de encabezado del mapa en nuestro código para usar sus funciones.
  4. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  5. Llame a la función principal(). El { marca el comienzo del cuerpo de la función.
  6. Cree un mapa llamado Estudiantes donde las claves serán números enteros y los valores serán cadenas.
  7. Insertar valores en el mapa Estudiantes. Se insertará una clave de 200 y un valor de Alice en el mapa.
  8. Insertar valores en el mapa Estudiantes. Se insertará una clave de 201 y un valor de John en el mapa.
  9. Utilice la función size() para obtener el tamaño del mapa llamado Students. Esto debería devolver un 2.
  10. Imprime algo de texto en la consola.
  11. Utilice un bucle for para crear un iterador llamado it para iterar sobre los elementos del mapa llamado Estudiantes.
  12. Imprime los valores del mapa Estudiantes en la consola.
  13. Fin del cuerpo del bucle for.
  14. Fin del cuerpo de la función main().

Insertando datos en std::map

Puedes insertar elementos en std::map usando la función insert(). Recuerda que las claves de std::map deben ser únicas.

Primero, comprueba si cada clave está presente en el mapa. Si está presente, no se insertará la entrada, sino que se devolverá el iterador de la entrada existente. Si no está presente, se inserta la entrada.

La función tiene las siguientes variaciones:

  • insertar(par) – Con esta variante, se inserta un par clave-valor en el mapa.
  • insertar(itr_inicio, iterador_fin) – con esta variación, las entradas se insertarán dentro del rango definido por start_itr y end_itr de otro mapa.

La función insert_or_assign() funciona de la misma manera que la función insert(), pero si la clave dada ya existe en el mapa, su valor se modificará.

Ejemplo

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

Salida:

C++ Ejemplo de inserción de mapa 2 salida

Aquí hay una captura de pantalla del código:

C++ Código de ejemplo 2 para insertar en el mapa

Code Explicación:

  1. Incluya el archivo de encabezado del mapa en nuestro código para usar sus funciones.
  2. Incluya el archivo de encabezado iostream en nuestro código para usar sus funciones.
  3. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  4. Llame a la función principal(). El { marca el comienzo del cuerpo de la función.
  5. Cree un mapa llamado m donde las claves serán números enteros y los valores serán números enteros. Se han realizado tres entradas en el mapa.
  6. Insertar una nueva entrada en el mapa m. Se insertará una clave de 5 y un valor de 6 en el mapa.
  7. Intentando realizar una entrada en una clave ya existente. Como la clave 1 ya existe en el mapa, no se realizará la entrada.
  8. Utilice la función insert_or_assign() para insertar o modificar una entrada existente. Dado que la clave 1 ya existe, su valor se cambiará a 6.
  9. Imprime algo de texto en la consola. El carácter "\t" crea un espacio horizontal mientras que el carácter "\n" mueve el cursor del mouse a la siguiente línea.
  10. Use un en bucle para crear un iterador llamado itr para iterar sobre los elementos del mapa llamado m.
  11. Imprime los valores del mapa m en la consola. El carácter “\t” crea un espacio horizontal entre cada clave y su valor correspondiente. Por el contrario, el carácter “\n” mueve el cursor del mouse a la siguiente línea después de cada iteración.
  12. Fin del cuerpo del bucle for.
  13. El programa debe devolver un valor al finalizar con éxito.
  14. Fin del cuerpo de la función main().

Buscando en un mapa

Podemos usar la función find() para buscar elementos en un mapa mediante sus claves. Si no se encuentra la clave, la función devuelve std::map::end. En caso contrario, se devuelve un iterador del elemento buscado.

Ejemplo

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

Salida:

C++ Ejemplo de salida de búsqueda de mapa 3

Aquí hay una captura de pantalla del código:

C++ Código de ejemplo 3 para buscar en el mapa

Code Explicación:

  1. Incluya el archivo de encabezado iostream en nuestro código para usar sus funciones sin obtener errores.
  2. Incluya el archivo de encabezado de cadena en nuestro código para usar sus funciones sin obtener errores.
  3. Incluya el archivo de encabezado del mapa en nuestro código para usar sus funciones sin obtener errores.
  4. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  5. Llama a la función main(). La llave { marca el comienzo del cuerpo de la función main().
  6. Cree un mapa llamado Estudiantes cuyas claves serán números enteros y cadenas de valores.
  7. Insertar valores en el mapa Estudiantes. Se insertará una clave de 200 y un valor de Alice en el mapa.
  8. Insertar valores en el mapa Estudiantes. Se insertará una clave de 201 y un valor de John en el mapa.
  9. Busque el valor asociado con una clave de 201.
  10. Utilice una declaración if para comprobar si se encuentra el valor de la clave.
  11. Imprima el valor de la clave junto con algún texto en la consola.
  12. Fin del cuerpo de la declaración if.
  13. Fin del cuerpo de la función main().

Eliminar datos de un mapa

Podemos usar la función erase() para eliminar un valor de un mapa. Simplemente creamos un iterador que apunta al elemento que queremos eliminar. Luego, pasamos el iterador a la función erase().

Ejemplo

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

Salida:

C++ mapear borrar eliminar Ejemplo 4 salida

Aquí hay una captura de pantalla del código:

C++ borrar mapa eliminar Ejemplo 4 código

Code Explicación:

  1. Incluya el archivo de encabezado iostream en nuestro código para usar sus funciones.
  2. Incluya el archivo de encabezado de cadena en nuestro código para usar sus funciones.
  3. Incluya el archivo de encabezado del mapa en nuestro código para usar sus funciones.
  4. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  5. Llama a la función main(). La llave { marca el comienzo del cuerpo de la función main().
  6. Cree un mapa llamado my_map cuyas claves serán cadenas y valores enteros.
  7. Inserta valores en el mapa my_map. Se insertará una clave de Vaca y un valor de 1 en el mapa.
  8. Inserta valores en el mapa my_map. Se insertará una clave de Cat y un valor de 2 en el mapa.
  9. Agregue un valor 3 al mapa my_map con una clave de león.
  10. Cree un iterador para iterar sobre el mapa my_map buscando la clave cat.
  11. Elimina el elemento señalado por el iterador.
  12. Utilice un iterador para recorrer los elementos del mapa my_map desde el principio hasta el final.
  13. Imprime el contenido del mapa my_map en la consola.
  14. El programa debe devolver resultados al finalizar con éxito.
  15. Fin del cuerpo de la función main().

Preguntas Frecuentes

`std::map` mantiene las claves ordenadas mediante un árbol de búsqueda binaria autoequilibrado, lo que resulta en operaciones de O(log n). `std::unordered_map` utiliza una tabla hash para búsquedas con un promedio de O(1), pero almacena las claves sin un orden específico. Elija según sus necesidades de ordenación.

Un `std::map` se implementa típicamente como un árbol de búsqueda binaria autoequilibrado, generalmente un árbol rojo-negro. Esto mantiene las claves ordenadas y garantiza un tiempo logarítmico para las operaciones de inserción, eliminación y búsqueda.

No. Un `std::map` solo almacena claves únicas, por lo que insertar una clave existente no la sobrescribe. Cuando se requieren claves duplicadas, utilice `std::multimap`, que permite que varios elementos compartan el mismo valor de clave.

Utilice map_name[clave] para leer o asignar un valor; el operador de subíndice inserta una entrada predeterminada si falta la clave. El miembro at() lanza una excepción para las claves ausentes, lo que lo convierte en una opción más segura.

Pasa un comparador personalizado como tercer argumento de plantilla, como std::map El comparador mayor ordena las claves de mayor a menor en lugar del orden ascendente predeterminado.

Un `std::map` almacena pares clave-valor y busca valores por clave, mientras que un `std::set` almacena solo claves únicas sin valor asociado. Ambos mantienen los elementos ordenados, pero un mapa asocia datos a cada clave.

Sí. Los asistentes de codificación de IA convierten una breve indicación o comentario en código std::map funcional, incluyendo declaraciones, llamadas de inserción y bucles iteradores. Siempre revise los tipos de clave generados, el orden y los casos límite antes de compilar.

Sí. Copiloto de GitHub Sugiere declaraciones de mapas, llamadas a funciones de inserción y búsqueda, y bucles de iteración a medida que escribes. Maneja bien el código repetitivo, aunque conviene verificar la unicidad de las claves y la lógica antes de compilar.

Resumir este post con: