Карта в C++ Стандартная библиотека шаблонов (STL)

⚡ Умное резюме

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

  • 🗺️ Ассоциативный контейнер: A C++ В таблице `map` элементы хранятся в виде пар «ключ-значение» с уникальными, автоматически отсортированными ключами.
  • 🧩 Заголовок и синтаксис: Добавьте заголовок карты, затем объявите std::map. имя для хранения типизированных пар.
  • 🇧🇷 Встроенные функции: Функции begin(), size(), empty(), insert(), find(), erase() и clear() управляют содержимым карты.
  • 🔄 Итерация: Двунаправленный итератор обходит элементы карты в отсортированном порядке по ключу для чтения или удаления.
  • 🔑 Уникальные ключи: Два элемента не могут иметь общий ключ, что делает карту идеальным ассоциативным массивом.
  • 🤖 Помощь ИИ: GitHub Copilot и аналогичные ИИ-помощники создают объявления карт и циклы на основе короткого комментария.

Карта в 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;
	}
}

Выход:

C++ Пример 1: итерация карты и вывод.

Вот скриншот кода:

C++ Пример кода итерации карты 1

Code Объяснение:

  1. Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
  2. Включите файл заголовка строки в наш код, чтобы использовать его функции.
  3. Включите файл заголовка карты в наш код, чтобы использовать его функции.
  4. Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
  5. Вызовите функцию main(). { отмечает начало тела функции.
  6. Создайте карту с именем «Студенты», где ключи будут целыми числами, а значения — строками.
  7. Вставьте значения в карту Студенты. На карту будут вставлены ключ 200 и значение Алисы.
  8. Вставьте значения в карту Студенты. На карту будут вставлены ключ 201 и значение John.
  9. Используйте функцию size(), чтобы получить размер карты с именем «Студенты». Это должно вернуть 2.
  10. Напечатайте текст на консоли.
  11. Используйте цикл for, чтобы создать итератор с именем it для перебора элементов карты с именем Student.
  12. Распечатайте значения карты Студенты на консоли.
  13. Конец тела цикла for.
  14. Конец тела функции 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;
}

Выход:

C++ Пример 2: вставка карты

Вот скриншот кода:

C++ Пример кода для вставки карты (пример 2)

Code Объяснение:

  1. Включите файл заголовка карты в наш код, чтобы использовать его функции.
  2. Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
  3. Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
  4. Вызовите функцию main(). { отмечает начало тела функции.
  5. Создайте карту с именем m, где ключи будут целыми числами, а значения — целыми числами. На карте сделано три записи.
  6. Вставьте новую запись в карту m. На карту будут вставлены ключ 5 и значение 6.
  7. Пытаюсь сделать запись в уже существующий ключ. Поскольку ключ 1 уже существует в карте, запись не будет сделана.
  8. Использование функции Insert_or_assign() для вставки или изменения существующей записи. Поскольку ключ 1 уже существует, его значение будет изменено на 6.
  9. Напечатайте текст на консоли. Символ «\t» создает горизонтальное пространство, а символ «\n» перемещает курсор мыши на следующую строку.
  10. Использовать для цикла чтобы создать итератор с именем itr для перебора элементов карты с именем m.
  11. Выведите значения карты m на консоль. Символ «\t» создает горизонтальный пробел между каждым ключом и соответствующим ему значением. Напротив, символ «\n» перемещает курсор мыши на следующую строку после каждой итерации.
  12. Конец тела цикла for.
  13. Программа должна вернуть значение после успешного завершения.
  14. Конец тела функции 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';
	}
}

Выход:

C++ Карта, поиск, поиск. Пример 3, вывод.

Вот скриншот кода:

C++ Поиск на карте Пример кода 3

Code Объяснение:

  1. Включите заголовочный файл iostream в наш код, чтобы использовать его функции без ошибок.
  2. Включите файл заголовка строки в наш код, чтобы использовать его функции без ошибок.
  3. Включите файл заголовка карты в наш код, чтобы использовать ее функции без ошибок.
  4. Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
  5. Вызовите функцию main(). { отмечает начало тела функции main().
  6. Создайте карту с именем «Студенты», ключи которой будут целыми числами, а строками значений.
  7. Вставьте значения в карту Студенты. На карту будут вставлены ключ 200 и значение Алисы.
  8. Вставьте значения в карту Студенты. На карту будут вставлены ключ 201 и значение John.
  9. Найдите значение, связанное с ключом 201.
  10. Используйте оператор if, чтобы проверить, найдено ли значение для ключа.
  11. Напечатайте значение ключа рядом с текстом на консоли.
  12. Конец тела оператора if.
  13. Конец тела функции 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;
}

Выход:

C++ map erase delete Пример 4 вывод

Вот скриншот кода:

C++ map erase delete Пример кода 4

Code Объяснение:

  1. Включите заголовочный файл iostream в наш код, чтобы использовать его функции.
  2. Включите файл заголовка строки в наш код, чтобы использовать его функции.
  3. Включите файл заголовка карты в наш код, чтобы использовать его функции.
  4. Включите пространство имен std в наш код, чтобы использовать его классы без его вызова.
  5. Вызовите функцию main(). { отмечает начало тела функции main().
  6. Создайте карту с именем my_map, ключи которой будут строками, а значения — целыми числами.
  7. Вставьте значения в карту my_map. На карту будет вставлен ключ Cow и значение 1.
  8. Вставьте значения в карту my_map. На карту будет вставлен ключ Cat и значение 2.
  9. Добавьте значение 3 в карту my_map с ключом льва.
  10. Создайте итератор для перебора карты my_map в поисках ключевого кота.
  11. Удалите элемент, на который указывает итератор.
  12. Используйте итератор для перебора элементов карты my_map от начала до конца.
  13. Распечатайте содержимое карты my_map на консоли.
  14. Программа должна вернуть результат после успешного завершения.
  15. Конец тела функции main().

Часто задаваемые вопросы (FAQ)

std::map хранит ключи в отсортированном виде с помощью самобалансирующегося бинарного дерева поиска, обеспечивая O(log n) операций. std::unordered_map использует хеш-таблицу для поиска в среднем O(1), но хранит ключи без определенного порядка. Выберите подходящий вариант в зависимости от ваших потребностей в упорядочивании.

Обычно std::map реализуется как самобалансирующееся бинарное дерево поиска, чаще всего красно-черное дерево. Это позволяет поддерживать ключи в отсортированном порядке и гарантирует логарифмическое время для операций вставки, удаления и поиска.

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

Используйте map_name[key] для чтения или присвоения значения; оператор индексации вставляет запись по умолчанию, если ключ отсутствует. Член at() генерирует исключение для отсутствующих ключей, что делает его более безопасным выбором.

В качестве третьего аргумента шаблона передайте пользовательский компаратор, например, std::map. >. Более высокий компаратор упорядочивает ключи от наибольшего значения к наименьшему, а не в порядке возрастания по умолчанию.

std::map хранит пары ключ-значение и ищет значения по ключу, в то время как std::set хранит только уникальные ключи без связанных с ними значений. Оба типа хранят элементы в отсортированном виде, но map связывает данные с каждым ключом.

Да. Искусственный интеллект в качестве помощника в программировании преобразует короткий запрос или комментарий в работающий код std::map, включая объявления, вызовы функции вставки и циклы итераторов. Всегда проверяйте сгенерированные типы ключей, порядок их расположения и граничные случаи перед компиляцией.

Да. Второй пилот GitHub Предлагает объявления карт, вызовы функций вставки и поиска, а также циклы итерации по мере ввода. Хорошо справляется с повторяющимся шаблонным кодом, хотя перед сборкой все равно следует проверять уникальность ключей и логику.

Подведем итог этой публикации следующим образом: