Классы контейнеров C++<map>

В C++,<map>Это часть Стандартной библиотеки шаблонов (STL), предоставляющая ассоциативный контейнер для хранения пар ключ-значение.

mapЭлементы в контейнере автоматически сортируются по порядку ключей, что делает его очень подходящим для сценариев, требующих быстрого поиска и упорядоченных данных.

Определение и характеристики

  • Пары ключ-значение:mapОн хранит пары ключ-значение, где каждый ключ уникален.
  • Сортировка:mapЭлементы в нём автоматически сортируются по порядку ключей, обычно по возрастанию.
  • Уникальность: каждый ключ вmapможет появиться только один раз.
  • Двунаправленный итератор:mapОн предоставляет двунаправленные итераторы, позволяя обходить элементы в прямом и обратном направлениях.

Базовый синтаксис

Подключение заголовочного файла:

#include <map>

Объявите контейнер map:

std::map<key_type, value_type> myMap;
  • key_type— это тип ключа.
  • value_type— это тип значения.

Вставка элементов:

myMap[key] = value;

Доступ к элементам:

value = myMap[key];

Обход map:

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

В стандартах C++11 и более поздних часть обхода можно упростить до цикла for по диапазону, сделав код более кратким:

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

Пример

Ниже приведён пример использованияmapпростой пример: мы создадимmapчтобы хранить имена сотрудников и их возраст и обойти этотmapчтобы вывести имя и возраст каждого сотрудника.

Пример

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

int main() {
    // Создаём контейнер map для хранения имён сотрудников и их возрастов
    std::map<std::string, int> employees;

    // Вставить информацию о сотрудниках
    employees["Alice"] = 30;
    employees["Bob"] = 25;
    employees["Charlie"] = 35;

    // Пройти по map и вывести информацию о сотрудниках
    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;
}

Вывод:

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

Продвинутое использование

Проверка наличия ключа:

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

Удаление элементов:

myMap.erase(key);

Очистка map:

myMap.clear();

Получение размера map:

size_t size = myMap.size();

Другие методы:

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

Для пользовательской сортировки по умолчанию используется порядок по возрастанию; можно использовать std::greater или пользовательскую функцию сравнения:

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

Используйте пользовательскую функцию сравнения:

Пример

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

    // Другие операции...

    return 0;
}

map — очень полезный контейнер в C++ STL, особенно подходит для сценариев, требующих быстрого поиска и упорядоченных данных.

Пример

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

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

    // Вставка
    scores["Alice"] = 90;
    scores["Bob"] = 85;
    scores.insert({"Charlie", 92});

    // Обход
    for (auto &p : scores) {
        std::cout << p.first << " => " << p.second << std::endl;
    }

    // Найти
    auto it = scores.find("Bob");
    if (it != scores.end()) {
        std::cout << "Счёт Боба: " << it->second << std::endl;
    }

    // Удаление
    scores.erase("Alice");

    std::cout << "Размер: " << scores.size() << std::endl;

    return 0;
}

Результат выполнения (автоматически отсортирован по ключу):

Alice => 90
Bob => 85
Charlie => 92
Bob's score: 85
Size: 2
Другие расширения