Карта в 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
. Карта матиме рядок як ключ типи даних і ціле число як величини тип даних.
Типи учасників
Функції-члени можуть використовувати такі типи членів як параметри або тип повернення:
- 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; } }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка iostream у наш код, щоб використовувати його функції.
- Включіть файл заголовка рядка в наш код, щоб використовувати його функції.
- Включіть файл заголовка карти в наш код, щоб використовувати його функції.
- Включіть простір імен std у наш код, щоб використовувати його класи без його виклику.
- Телефонуйте
main()
функція. { позначає початок тіла функції. - Створіть карту під назвою Students, де ключі будуть цілими числами, а значення – рядками.
- Вставте значення на карту Учні. На карту буде вставлено ключ 200 і значення Аліси.
- Вставте значення на карту Учні. На карту буде вставлено ключ 201 і значення Джон.
- Використовувати
size()
щоб отримати розмір карти під назвою Студенти. Це має повернути 2. - Надрукуйте текст на консолі.
- Використовуйте цикл for, щоб створити ітератор із назвою it для повторення елементів карти під назвою Students.
- Вивести значення карти Учні на консоль.
- Кінець тіла циклу 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()
функції. - Створіть карту під назвою Students, ключі якої будуть цілими числами, а значення – рядками.
- Вставте значення на карту Учні. На карту буде вставлено ключ 200 і значення Аліси.
- Вставте значення на карту Учні. На карту буде вставлено ключ 201 і значення Джон.
- Знайдіть значення, пов’язане з ключем 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. На карту буде вставлено ключ корови та значення 1.
- Вставте значення в карту my_map. На карту буде вставлено ключ Cat і значення 2.
- Додайте значення 3 на карту my_map з ключем лева.
- Створіть ітератор для повторення карти my_map у пошуках ключа cat.
- Видалити елемент, на який вказує ітератор.
- Використовуйте ітератор для повторення елементів карти my_map від початку до кінця.
- Роздрукуйте вміст карти my_map на консолі.
- Після успішного завершення програма повинна повернути результат.
- Кінець корпусу
main()
функції.
Підсумки
- Карта — це асоціативний контейнер, який зберігає елементи у відображеній формі.
- Кожен елемент на карті має ключове значення та зіставлене значення.
- У карті два зіставлених значення не можуть мати спільні ключові значення.
- Ключові значення допомагають однозначно сортувати та ідентифікувати елементи.
- Відображені значення допомагають зберігати вміст, пов’язаний із ключем.
- C++ map зберігає унікальні ключі в порядку сортування.
- Для роботи C++ map, ми створюємо ітератор для повторення елементів.
- За допомогою ітератора ми можемо виконувати такі завдання, як пошук і видалення елементів з карти.