Классы контейнеров 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 <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 <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 <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Другие расширения