Карта в C++ Стандартная библиотека шаблонов (STL)
Что такое Карта 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_name
это название карты.
Например:
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 поставляется со встроенными функциями. Некоторые из них включают в себя:
- начинать() - Эта функция возвращает итератор к первому элементу карты.
- размер() -Эта функция возвращает количество элементов на карте.
- пустой() -Эта функция возвращает логическое значение, указывающее, пуста ли карта.
- вставить(пара(ключ, значение)) – Эта функция вставляет новую пару ключ-значение на карту.
- найти(значение) – Эта функция передает итератор элементу 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; } }
Вывод:
Вот скриншот кода:
Пояснение к коду:
- Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка строки в наш код, чтобы использовать его функции.
- Включите файл заголовка карты в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
- Позвоните
main()
функция. { отмечает начало тела функции. - Создайте карту с именем «Студенты», где ключи будут целыми числами, а значения — строками.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 200 и значение Алисы.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 201 и значение John.
- Использовать
size()
функция, чтобы получить размер карты с именем Студенты. Это должно вернуть 2. - Напечатайте текст на консоли.
- Используйте цикл for, чтобы создать итератор с именем it для перебора элементов карты с именем Student.
- Распечатайте значения карты Студенты на консоли.
- Конец тела цикла for.
- Конец тела
main()
функции.
Вставка данных в std::map
Вы можете вводить элементы в std::map, используя insert()
функция. Помните, что ключи std::map должны быть уникальными.
Итак, сначала он проверяет, присутствует ли каждый ключ на карте. Если он присутствует, запись не будет вставлена, но будет возвращен итератор для существующей записи. Если его нет, запись вставляется.
Функция имеет следующие вариации:
- вставка(пара) – в этом варианте в карту вставляется пара ключ-значение.
- вставить(start_itr, end_itr) – в этом варианте записи будут вставлены в диапазон, определенный start_itr и end_itr из другой карты.
Команда Insert_or_assing() функция работает так же, как 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; }
Вывод:
Вот скриншот кода:
Пояснение к коду:
- Включите файл заголовка карты в наш код, чтобы использовать его функции.
- Включите заголовочный файл 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'; } }
Вывод:
Вот скриншот кода:
Пояснение к коду:
- Включите заголовочный файл iostream в наш код, чтобы использовать его функции без ошибок.
- Включите файл заголовка строки в наш код, чтобы использовать его функции без ошибок.
- Включите файл заголовка карты в наш код, чтобы использовать ее функции без ошибок.
- Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
- Позвоните
main()
функция. { отмечает начало телаmain()
функции. - Создайте карту с именем «Студенты», ключи которой будут целыми числами, а строками значений.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 200 и значение Алисы.
- Вставьте значения в карту Студенты. На карту будут вставлены ключ 201 и значение John.
- Найдите значение, связанное с ключом 201.
- Используйте оператор if, чтобы проверить, найдено ли значение для ключа.
- Напечатайте значение ключа рядом с текстом на консоли.
- Конец тела оператора if.
- Конец тела
main()
функции.
Удаление данных с карты
Мы можем использовать erase()
функция для удаления значения с карты. Мы просто создаем итератор, указывающий на удаляемый элемент. Затем итератор передается в 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; }
Вывод:
Вот скриншот кода:
Пояснение к коду:
- Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
- Включите файл заголовка строки в наш код, чтобы использовать его функции.
- Включите файл заголовка карты в наш код, чтобы использовать его функции.
- Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
- Позвоните
main()
функция. { отмечает начало телаmain()
функции. - Создайте карту с именем my_map, ключи которой будут строками, а значения — целыми числами.
- Вставьте значения в карту my_map. На карту будет вставлен ключ Cow и значение 1.
- Вставьте значения в карту my_map. На карту будет вставлен ключ Cat и значение 2.
- Добавьте значение 3 в карту my_map с ключом льва.
- Создайте итератор для перебора карты my_map в поисках ключевого кота.
- Удалите элемент, на который указывает итератор.
- Используйте итератор для перебора элементов карты my_map от начала до конца.
- Распечатайте содержимое карты my_map на консоли.
- Программа должна вернуть результат после успешного завершения.
- Конец тела
main()
функции.
Резюме
- Карта — это ассоциативный контейнер, в котором элементы хранятся в отображенной форме.
- Каждый элемент на карте имеет ключевое значение и сопоставленное значение.
- На карте два сопоставленных значения не могут иметь общие значения ключей.
- Ключевые значения помогают однозначно сортировать и идентифицировать элементы.
- Сопоставленные значения помогают хранить контент, связанный с ключом.
- C++ карта хранит уникальные ключи в отсортированном порядке.
- Работать с C++ map мы создаем итератор для перебора элементов.
- С помощью итератора мы можем выполнять такие задачи, как поиск и удаление элементов с карты.