Карта в стандартной библиотеке шаблонов C++ (STL) с примером печати
Что такое std::map?
В C++ MAP представляет собой ассоциативный контейнер, хранящий элементы в отображенной форме. Каждый элемент на карте состоит из пары «ключ-значение» и сопоставленного значения. Два сопоставленных значения не могут иметь одни и те же значения ключа.
Ключевые значения хороши для сортировки и уникальной идентификации элементов. Сопоставленные значения предназначены для хранения содержимого, связанного с ключом. Они могут различаться по типам, но тип члена объединяет их через парный тип, объединяющий оба типа.
Из этого руководства по C++ вы узнаете:
- Что такое std::map?
- Зачем использовать std::map?
- Синтаксис:
- Типы участников:
- Встроенные функции
- Перебор элементов карты
- Вставка данных в std::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. Карта будет иметь строку в качестве key типы данных и целые числа как значения тип данных.
Типы участников:
Функции-члены могут использовать следующие типы членов в качестве параметров или типа возвращаемого значения:
- key_type: Ключ (первый параметр в шаблоне)
- mapped_type: T (второй параметр в шаблоне)
- key_compare: Сравнить (третий параметр в шаблоне)
- allocator_type: Alloc (четвертый параметр в шаблоне)
- тип_значения: пара
- сравнить_значение: Вложенный функциональный класс для сравнения элементов
- ссылка: allocator_type::reference
- const_reference: allocator_type::const_reference
- указатель: allocator_type::указатель
- const_pointer: allocator_type::const_pointer
- итератор: двунаправленный итератор для value_type
- const_iterator: двунаправленный итератор для const value_type
- reverse_iterator: обратный итератор
- const_reverse_iterator: постоянный обратный итератор
- difference_type: ptrdiff_t
- size_type: размер_t
Встроенные функции
std::map поставляется со встроенными функциями. Некоторые из них включают:
- начать()- Эта функция возвращает итератор к первому элементу карты.
- размер()- Эта функция возвращает количество элементов на карте.
- пусто()- Эта функция возвращает логическое значение, указывающее, пуста ли карта.
- вставить(пара(ключ, значение))- Эта функция вставляет в карту новую пару "ключ-значение".
- найти(val)- Эта функция передает итератор элементу val, если он найден. В противном случае он вернет m.end().
- Стереть (позиция итератора)- Эта функция удаляет элемент в позиции, указанной итератором.
- стереть(const g) – Эта функция удаляет ключ-значение 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 для перебора элементов карты с именем Студенты.
- Распечатайте значения карты Студенты на консоли.
- Конец тела цикла for.
- Конец тела функции main().
Вставка данных в std::map
Вы можете вводить элементы в std::map с помощью функции insert(). Помните, что ключи std::map должны быть уникальными.
Итак, сначала он проверяет, присутствует ли каждый ключ на карте. Если он присутствует, запись не будет вставлена, но будет возвращен итератор для существующей записи. Если его нет, запись вставляется.
Функция имеет следующие варианты:
- вставить(пара)- в этом варианте в карту вставляется пара "ключ-значение".
- insert(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» перемещает курсор мыши на следующую строку.
- Используйте цикл for для создания итератора с именем itr для перебора элементов карты с именем m.
- Выведите значения карты m на консоль. Символ «\t» создает горизонтальный пробел между каждым ключом и соответствующим ему значением. Напротив, символ «\n» перемещает курсор мыши на следующую строку после каждой итерации.
- Конец тела цикла for.
- Программа должна возвращать значение после успешного завершения.
- Конец тела функции main().
Поиск на карте
Мы можем использовать функцию find() для поиска элементов на карте по их ключам. Если ключ не найден, функция возвращает std::map::end. В противном случае будет возвращен итератор искомого элемента.
Пример 2:
#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().
Пример 3:
#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++ мы создаем итератор для перебора элементов.
- С помощью итератора мы можем выполнять такие задачи, как поиск и удаление элементов с карты.
Язык C
- Стандартные библиотечные функции C
- Операторы в C++ с примером:что такое, типы и программы
- Цикл C++ do…while с примерами
- Оператор C++ Switch Case с ПРИМЕРОМ
- C++ динамическое выделение массивов с примером
- Указатели C++ с примерами
- Перегрузка оператора C++ с примерами
- std::list в C++ с примером
- Функции C++ с примерами программ
- Разница между структурой и классом:объяснение на примере C++