Карта в C++ Стандартна библиотека с шаблони (STL)
В какво е Map C++? Синтаксис
In C++, а КАРТА е асоциативен контейнер, съхраняващ елементи в картографирана форма. Всеки елемент в картата е съставен от ключ-стойност и картографирана стойност. Две съпоставени стойности не могат да споделят едни и същи ключови стойности.
Ключовите стойности са добри за уникално сортиране и идентифициране на елементи. Нанесените стойности са за съхраняване на съдържание, свързано с ключа. Двата може да се различават по типове, но типът член ги комбинира чрез тип двойка, който комбинира и двете.
Защо да използвате 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: Ключ (първият параметър в шаблона)
- mapped_type: T (Вторият параметър в шаблона)
- key_compare: Сравнение (третият параметър в шаблона)
- тип_разпределител: Alloc (Четвъртият параметър в шаблона)
- value_type: двойка
- стойност_сравнение: Клас на вложена функция за сравняване на елементи
- справка: allocator_type::reference
- const_reference: allocator_type::const_reference
- показалка: тип_разпределител::указател
- const_pointer: allocator_type::const_pointer
- итератор: двупосочен итератор към value_type
- const_iterator: двупосочен итератор към const value_type
- обратен_итератор: обратен итератор
- const_reverse_iterator: постоянен обратен итератор
- тип_различие: ptrdiff_t
- size_type: размер_т
Вградени функции на 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()
функция за получаване на размера на картата с име Students. Това трябва да върне 2. - Отпечатайте малко текст на конзолата.
- Използвайте for цикъл, за да създадете итератор, наречен той, за да обхожда елементите на картата, наречени Students.
- Отпечатайте стойностите на картата Students на конзолата.
- Край на тялото на for цикъла.
- Краят на тялото на
main()
функция.
Вмъкване на данни в std::map
Можете да въвеждате елементи в std::map, като използвате insert()
функция. Не забравяйте, че ключовете std::map трябва да са уникални.
Така че първо проверява дали всеки ключ присъства в картата. Ако е налице, записът няма да бъде вмъкнат, но връща итератора за съществуващия запис. Ако не присъства, записът се вмъква.
Функцията има следните разновидности:
- вмъкване (двойка) – с тази вариация в картата се вмъква двойка ключ-стойност.
- вмъкване (start_itr, end_itr) – с тази вариация, записите ще бъдат вмъкнати в диапазона, определен от start_itr и end_itr от друга карта.
- вмъкване_или_асинг() функция работи по същия начин като 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()
функция.
Oбобщение
- Картата е асоциативен контейнер, който съхранява елементи в картографирана форма.
- Всеки елемент в картата има ключова стойност и картографирана стойност.
- В една карта две нанесени стойности не могат да споделят ключови стойности.
- Ключовите стойности помагат при уникалното сортиране и идентифициране на елементите.
- Нанесените стойности помагат при съхраняването на съдържание, свързано с ключа.
- C++ map съхранява уникални ключове в сортиран ред.
- Да работя с C++ map, създаваме итератор за итериране на елементите.
- С итератора можем да изпълняваме задачи като търсене и изтриване на елементи от картата.