Clase de contenedor de C++<map>

En C++,<map>es parte de la Biblioteca de Plantillas Estándar (STL), que proporciona un contenedor asociativo para almacenar pares clave-valor.

mapLos elementos del contenedor se ordenan automáticamente según el orden de las claves, lo que lo hace muy adecuado para escenarios que requieren búsqueda rápida y datos ordenados.

Definición y características

  • Pares clave-valor:mapAlmacena pares clave-valor, donde cada clave es única.
  • Ordenación:mapLos elementos en él se ordenan automáticamente según el orden de las claves, normalmente en orden ascendente.
  • Unicidad: cada clavemapsolo puede aparecer una vez en él.
  • Iterador bidireccional:mapProporciona iteradores bidireccionales, que permiten recorrer los elementos hacia adelante y hacia atrás.

Sintaxis básica

Incluir el archivo de cabecera:

#include <map>

Declarar el contenedor map:

std::map<key_type, value_type> myMap;
  • key_typees el tipo de la clave.
  • value_typees el tipo del valor.

Insertar elementos:

myMap[key] = value;

Acceder a elementos:

value = myMap[key];

Recorrer el map:

for (std::map<key_type, value_type>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
    std::cout << it->first << " => " << it->second << std::endl;
}

En el estándar C++11 y posteriores, la parte de recorrido se puede simplificar con un bucle for basado en rangos, haciendo el código más conciso:

for (auto &p : m) {
    std::cout << p.first << " : " << p.second << std::endl;
}

Ejemplo

A continuación se muestra un ejemplo simple que usamap, crearemos unmappara almacenar los nombres y edades de los empleados, y recorrer estemappara imprimir el nombre y la edad de cada empleado.

Ejemplo

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

int main() {
    // Crear un contenedor map para almacenar el nombre y la edad de los empleados
    std::map<std::string, int> employees;

    // Insertar información de los empleados
    employees["Alice"] = 30;
    employees["Bob"] = 25;
    employees["Charlie"] = 35;

    // Recorrer el map e imprimir la información de los empleados
    for (std::map<std::string, int>::iterator it = employees.begin(); it != employees.end(); ++it) {
        std::cout << it->first << " is " << it->second << " years old." << std::endl;
    }

    return 0;
}

Resultado de salida:

Alice is 30 years old.
Bob is 25 years old.
Charlie is 35 years old.

Uso avanzado

Comprobar si la clave existe:

if (myMap.find(key) != myMap.end()) {
    // 键存在
}

Eliminar elementos:

myMap.erase(key);

Vaciar el map:

myMap.clear();

Obtener el tamaño del map:

size_t size = myMap.size();

Otros métodos:

myMap.empty();      // 是否为空
myMap.count("Bob"); // key 是否存在(返回 0 o  1)

Ordenación personalizada. Por defecto el orden es ascendente, se puede usar std::greater o una función de comparación personalizada:

std::map<int, std::string, std::greater<int>> m;  // 降序

Usar una función de comparación personalizada:

Ejemplo

#include <map>
#include <string>
#include <functional>

bool myCompare(const std::string& a, const std::string& b) {
    return a < b;
}

int main() {
    std::map<std::string, int, std::function<bool(const std::string&, const std::string&)>> myMap(myCompare);

    // Otras operaciones...

    return 0;
}

map es un contenedor muy útil en C++ STL, especialmente adecuado para escenarios que requieren búsqueda rápida y datos ordenados.

Ejemplo

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

int main() {
    std::map<std::string, int> scores;

    // Insertar
    scores["Alice"] = 90;
    scores["Bob"] = 85;
    scores.insert({"Charlie", 92});

    // Recorrer
    for (auto &p : scores) {
        std::cout << p.first << " => " << p.second << std::endl;
    }

    // Buscar
    auto it = scores.find("Bob");
    if (it != scores.end()) {
        std::cout << "Bob's score: " << it->second << std::endl;
    }

    // Eliminar
    scores.erase("Alice");

    std::cout << "Size: " << scores.size() << std::endl;

    return 0;
}

Resultado de ejecución (ordenado automáticamente por clave):

Alice => 90
Bob => 85
Charlie => 92
Bob's score: 85
Size: 2
Otras extensiones