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

⚡ Розумний підсумок

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

  • 🗺️ Асоціативний контейнер: A C++ map зберігає елементи як пари ключ-значення з унікальними, автоматично відсортованими ключами.
  • 🧩 Заголовок та синтаксис: Додайте заголовок карти, а потім оголосіть std::map ім'я для зберігання типізованих пар.
  • 🛠️ Вбудовані функції: begin(), size(), empty(), insert(), find(), erase() та clear() керують вмістом карти.
  • 🔄 Ітерація: Двонаправлений ітератор переглядає елементи карти в відсортованому порядку ключів для читання або видалення.
  • 🔑 Унікальні ключі: Два елементи не можуть мати спільний ключ, що робить мапу ідеальним асоціативним масивом.
  • 🤖 Допомога AI: 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; 
  • Команда тип_ключових_даних позначає тип даних ключів карти.
  • Команда тип_даних_значення позначає тип даних значень, що відповідають ключам карти.
  • Команда map_name це назва карти.

Наприклад:

map<string, int> my_map; 

Ми оголосили карту з назвою my_map. Карта матиме рядок як тип даних ключа та ціле число як тип даних values.

Типи учасників

Функції-члени можуть використовувати такі типи членів як параметри або тип повернення:

  • key_type: Ключ (перший параметр у шаблоні)
  • зіставлений_тип: T (другий параметр у шаблоні)
  • key_compare: Порівняння (третій параметр у шаблоні)
  • allocator_type: Alloc (четвертий параметр у шаблоні)
  • value_type: пара
  • value_compare: Клас вкладеної функції для порівняння елементів
  • довідка: allocator_type::reference
  • const_reference: allocator_type::const_reference
  • покажчик: allocator_type::pointer
  • const_pointer: allocator_type::const_pointer
  • ітератор: двонаправлений ітератор до value_type
  • const_iterator: двонаправлений ітератор для const value_type
  • reverse_iterator: зворотний ітератор
  • const_reverse_iterator: постійний зворотний ітератор
  • тип_різниці: ptrdiff_t
  • size_type: size_t

Вбудовані функції std::map

std::map містить вбудовані функції. Деякі з них включають:

  • почати () – Ця функція повертає ітератор до першого елемента карти.
  • розмір () – Ця функція повертає кількість елементів на карті.
  • порожній() – Ця функція повертає логічне значення, яке вказує, чи є карта порожньою.
  • вставка(пара(ключ, значення)) – Ця функція вставляє нову пару ключ-значення в карту.
  • знайти(значення) – Ця функція повертає ітератор елементу 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;
	}
}

вихід:

C++ Вивід Прикладу 1 ітерації карти

Ось скріншот коду:

C++ Приклад 1 ітерації карти

Code Пояснення:

  1. Включіть файл заголовка iostream у наш код, щоб використовувати його функції.
  2. Включіть файл заголовка рядка в наш код, щоб використовувати його функції.
  3. Включіть файл заголовка карти в наш код, щоб використовувати його функції.
  4. Включіть простір імен std у наш код, щоб використовувати його класи без його виклику.
  5. Виклик функції main(). { позначає початок тіла функції.
  6. Створіть карту під назвою Students, де ключі будуть цілими числами, а значення – рядками.
  7. Вставте значення на карту Учні. На карту буде вставлено ключ 200 і значення Аліси.
  8. Вставте значення на карту Учні. На карту буде вставлено ключ 201 і значення Джон.
  9. Використайте функцію size(), щоб отримати розмір карти з назвою Students. Вона має повернути значення 2.
  10. Надрукуйте текст на консолі.
  11. Використовуйте цикл for, щоб створити ітератор із назвою it для повторення елементів карти під назвою Students.
  12. Вивести значення карти Учні на консоль.
  13. Кінець тіла циклу for.
  14. Кінець тіла функції main().

Вставлення даних у std::map

Ви можете вводити елементи в std::map за допомогою функції insert(). Пам'ятайте, що ключі std::map мають бути унікальними.

Отже, спочатку перевіряється, чи кожен ключ присутній у мапі. Якщо він присутній, запис не буде вставлено, але повертається ітератор для існуючого запису. Якщо його немає, запис буде вставлено.

Функція має наступні варіанти:

  • вставка (пара) – у цьому варіанті пара ключ-значення вставляється в карту.
  • вставка(початковий_ітермін, кінцевий_ітермін) – у цьому варіанті записи будуть вставлені в діапазон, визначений 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. Створіть карту під назвою Students, ключі якої будуть цілими числами, а значення – рядками.
  7. Вставте значення на карту Учні. На карту буде вставлено ключ 200 і значення Аліси.
  8. Вставте значення на карту Учні. На карту буде вставлено ключ 201 і значення Джон.
  9. Знайдіть значення, пов’язане з ключем 201.
  10. Використовуйте оператор if, щоб перевірити, чи знайдено значення для ключа.
  11. Надрукуйте значення ключа поруч із текстом на консолі.
  12. Кінець тіла оператора if.
  13. Кінець тіла функції 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;
}

вихід:

C++ видалення карти, видалення, вивід Приклад 4

Ось скріншот коду:

C++ Приклад 4 коду видалення карти

Code Пояснення:

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

Поширені запитання

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 пропонує оголошення мап, виклики вставки та пошуку, а також цикли ітерацій під час введення тексту. Він добре обробляє повторювані шаблони, хоча вам все одно слід перевірити унікальність ключа та логіку перед збиранням.

Підсумуйте цей пост за допомогою: