Карта в C++ Стандартная библиотека шаблонов (STL)
⚡ Умное резюме
Карта в C++ Это ассоциативный контейнер из стандартной библиотеки шаблонов, который хранит элементы в виде отсортированных пар ключ-значение, где каждый уникальный ключ соответствует одному значению, что обеспечивает быстрый поиск, вставку и упорядоченное перемещение.

Что такое Карта C++?
In C++MAP — это ассоциативный контейнер, хранящий элементы в отображенной форме. Каждый элемент в карте состоит из ключевого значения и отображенного значения. Два отображенных значения не могут иметь одинаковые ключевые значения.
Ключевые значения полезны для сортировки и уникальной идентификации элементов, в то время как отображаемые значения хранят содержимое, связанное с каждым ключом. Типы этих двух типов могут различаться, но тип элемента объединяет их в пару, содержащую оба параметра.
Прежде чем писать код, полезно понять, почему карта часто является наиболее подходящим контейнером для данных.
Зачем использовать std::map?
Вот причины, по которым стоит использовать карту:
- std::map хранит только уникальные ключи, отсортированные в соответствии с выбранными критериями сортировки.
- Поиск элементов с помощью ключа прост и быстр.
- К каждой клавише прикреплен только один элемент.
- std::map можно использовать как ассоциативный массив.
- Функция std::map может быть реализована с использованием сбалансированных бинарных деревьев.
Чтобы воспользоваться этими преимуществами, начните с синтаксиса объявления.
Синтаксис
Чтобы объявить std::map, используйте следующий синтаксис:
std::map<key_datatype, value_datatype>map_name;
- key_datatype обозначает тип данных ключей карты.
- value_datatype обозначает тип данных значений, соответствующих ключам карты.
- имя_карты это название карты.
Например:
map<string, int> my_map;
Мы объявили карту с именем my_map. В этой карте ключом будет строка, а значениями — целое число.
Типы членов
В качестве параметров или возвращаемых значений функции-члены могут использовать следующие типы данных:
- тип_ключа: Ключ (первый параметр в шаблоне)
- сопоставленный_тип: T (второй параметр в шаблоне)
- ключ_сравнение: Сравнить (третий параметр в шаблоне)
- тип_распределителя: Alloc (четвертый параметр в шаблоне)
- тип значения: пара
- значение_сравнить: Класс вложенных функций для сравнения элементов
- Справка: allocator_type::reference
- константная_ссылка: allocator_type::const_reference
- указатель: allocator_type::указатель
- константный_указатель: allocator_type::const_pointer
- итератор: двунаправленный итератор для value_type
- константный_итератор: двунаправленный итератор для const value_type
- обратный_итератор: обратный итератор
- const_reverse_iterator: постоянный обратный итератор
- разница_тип: ptrdiff_t
- размер_тип: размер_t
Встроенные функции std::map
std::map поставляется со встроенными функциями. Некоторые из них включают в себя:
- начинать () – Эта функция возвращает итератор к первому элементу карты.
- размер() – Эта функция возвращает количество элементов в карте.
- пустой() – Эта функция возвращает логическое значение, указывающее, пуста ли карта.
- вставить(пару(ключ, значение)) – Эта функция вставляет новую пару ключ-значение в карту.
- find(val) – Эта функция возвращает итератор к элементу val, если он найден. В противном случае она возвращает m.end().
- стереть (позиция итератора) – Эта функция удаляет элемент в позиции, на которую указывает итератор.
- стереть (константа г) – Эта функция удаляет пару ключ-значение g из карты.
- Чисто() – Эта функция удаляет все элементы с карты.
После определения функций, следующие примеры демонстрируют их применение на практике, начиная с итерации.
Перебор элементов карты
Вы можете перебирать элементы карты. Для этого нам просто нужно создать итератор и использовать его. Например:
Пример 1
#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; } }
Выход:
Вот скриншот кода:
Code Объяснение:
- Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка строки в наш код, чтобы использовать его функции.
- Включите файл заголовка карты в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
- Вызовите функцию main(). { отмечает начало тела функции.
- Создайте карту с именем «Студенты», где ключи будут целыми числами, а значения — строками.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 200 и значение Алисы.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 201 и значение John.
- Используйте функцию size(), чтобы получить размер карты с именем «Студенты». Это должно вернуть 2.
- Напечатайте текст на консоли.
- Используйте цикл for, чтобы создать итератор с именем it для перебора элементов карты с именем Student.
- Распечатайте значения карты Студенты на консоли.
- Конец тела цикла for.
- Конец тела функции main().
Вставка данных в std::map
Вы можете вводить элементы в std::map с помощью функции Insert(). Помните, что ключи std::map должны быть уникальными.
Итак, сначала проверяется, присутствует ли каждый ключ в карте. Если он присутствует, запись не будет вставлена, но возвращается итератор для существующей записи. Если он отсутствует, запись вставляется.
Функция имеет следующие вариации:
- вставить(пару) – В этом варианте в карту вставляется пара ключ-значение.
- insert(start_itr, end_itr) – При таком варианте записи будут вставлены в диапазон, определенный параметрами start_itr и end_itr из другой карты.
Функция insert_or_assign() работает аналогично функции insert(), но если заданный ключ уже существует в карте, его значение будет изменено.
Пример 2
#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; }
Выход:
Вот скриншот кода:
Code Объяснение:
- Включите файл заголовка карты в наш код, чтобы использовать его функции.
- Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
- Вызовите функцию main(). { отмечает начало тела функции.
- Создайте карту с именем m, где ключи будут целыми числами, а значения — целыми числами. На карте сделано три записи.
- Вставьте новую запись в карту m. На карту будут вставлены ключ 5 и значение 6.
- Пытаюсь сделать запись в уже существующий ключ. Поскольку ключ 1 уже существует в карте, запись не будет сделана.
- Использование функции Insert_or_assign() для вставки или изменения существующей записи. Поскольку ключ 1 уже существует, его значение будет изменено на 6.
- Напечатайте текст на консоли. Символ «\t» создает горизонтальное пространство, а символ «\n» перемещает курсор мыши на следующую строку.
- Использовать для цикла чтобы создать итератор с именем itr для перебора элементов карты с именем m.
- Выведите значения карты m на консоль. Символ «\t» создает горизонтальный пробел между каждым ключом и соответствующим ему значением. Напротив, символ «\n» перемещает курсор мыши на следующую строку после каждой итерации.
- Конец тела цикла for.
- Программа должна вернуть значение после успешного завершения.
- Конец тела функции main().
Поиск на карте
Для поиска элементов в карте по их ключам можно использовать функцию find(). Если ключ не найден, функция возвращает std::map::end. В противном случае будет возвращен итератор искомого элемента.
Пример 3
#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'; } }
Выход:
Вот скриншот кода:
Code Объяснение:
- Включите заголовочный файл iostream в наш код, чтобы использовать его функции без ошибок.
- Включите файл заголовка строки в наш код, чтобы использовать его функции без ошибок.
- Включите файл заголовка карты в наш код, чтобы использовать ее функции без ошибок.
- Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
- Вызовите функцию main(). { отмечает начало тела функции main().
- Создайте карту с именем «Студенты», ключи которой будут целыми числами, а строками значений.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 200 и значение Алисы.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 201 и значение John.
- Найдите значение, связанное с ключом 201.
- Используйте оператор if, чтобы проверить, найдено ли значение для ключа.
- Напечатайте значение ключа рядом с текстом на консоли.
- Конец тела оператора if.
- Конец тела функции main().
Удаление данных с карты
Мы можем использовать функцию Erase() для удаления значения с карты. Мы просто создаем итератор, указывающий на удаляемый элемент. Затем итератор передается функции стирания().
Пример 4
#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; }
Выход:
Вот скриншот кода:
Code Объяснение:
- Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка строки в наш код, чтобы использовать его функции.
- Включите файл заголовка карты в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
- Вызовите функцию main(). { отмечает начало тела функции main().
- Создайте карту с именем my_map, ключи которой будут строками, а значения — целыми числами.
- Вставьте значения в карту my_map. На карту будет вставлен ключ Cow и значение 1.
- Вставьте значения в карту my_map. На карту будет вставлен ключ Cat и значение 2.
- Добавьте значение 3 в карту my_map с ключом льва.
- Создайте итератор для перебора карты my_map в поисках ключевого кота.
- Удалите элемент, на который указывает итератор.
- Используйте итератор для перебора элементов карты my_map от начала до конца.
- Распечатайте содержимое карты my_map на консоли.
- Программа должна вернуть результат после успешного завершения.
- Конец тела функции main().






