Карта в библиотеката на стандартните шаблони на C ++ (STL) с пример

Съдържание:

Anonim

Какво е std :: map?

В C ++ MAP е асоциативен контейнер, съхраняващ елементи в картографирана форма. Всеки елемент в картата се състои от ключ-стойност и картографирана стойност. Две картографирани стойности не могат да споделят едни и същи ключови стойности.

Ключовите стойности са добри за сортиране и идентифициране на елементи по уникален начин. Картираните стойности са за съхраняване на съдържание, свързано с ключа. Двете могат да се различават по типове, но типът член ги комбинира чрез тип чифт, който комбинира и двата.

В този урок за C ++ ще научите:

  • Какво е std :: map?
  • Защо да използвам std :: map?
  • Синтаксис:
  • Типове членове:
  • Вградени функции
  • Итерация над елементите на картата
  • Вмъкване на данни в std :: map:
  • Търсене в карта
  • Изтриване на данни от карта

Защо да използвам std :: map?

Ето причините за използването на картата:

  • std :: map съхранява уникални ключове само в сортиран ред въз основа на избрани критерии за сортиране.
  • Лесно и бързо е да търсите елементи с помощта на ключа.
  • Към всеки ключ е прикрепен само един елемент.
  • std :: map може да се използва като асоциативен масив.
  • std :: map е изпълним, използвайки двоични дървета (балансиран).

Синтаксис:

За да декларирате std :: map, използвайте този синтаксис:

std::mapmap_name;
  • Key_datatype обозначава типа данни на ключовете на картата.
  • Value_datatype обозначава типа данни на стойностите, съответстващи на ключовете на картата.
  • Името на картата е името на картата.

Например:

map my_map;

Декларирахме карта с име my_map. Картата ще има низ като ключови типове данни и цяло число като тип данни за стойности .

Типове членове:

Функциите-членове могат да използват следните типове членове като параметри или тип на връщане:

  • key_type: Ключ (първият параметър в шаблона)
  • mapped_type: T (Вторият параметър в шаблона)
  • key_compare: Сравнение (третият параметър в шаблона)
  • allocator_type: Alloc (четвъртият параметър в шаблона)
  • value_type: чифт
  • value_compare: Вложен функционален клас за сравняване на елементи
  • справка: allocator_type :: reference
  • const_reference: разпределител_тип :: const_reference
  • указател: разпределител_тип :: указател
  • const_pointer: разпределител_тип :: const_pointer
  • iterator: двупосочен итератор към value_type
  • const_iterator: двупосочен итератор към const value_type
  • reverse_iterator: обратен итератор
  • const_reverse_iterator: постоянен обратен итератор
  • тип_разлика : ptrdiff_t
  • размер_тип: размер_т

Вградени функции

std :: map идва с вградени функции. Някои от тях включват:

  • begin () - Тази функция връща итератора към първия елемент на картата.
  • size () - Тази функция връща броя на елементите в картата.
  • empty () - Тази функция връща булева стойност, обозначаваща дали картата е празна.
  • вмъкване (двойка (ключ, стойност)) - Тази функция вмъква нова двойка ключ-стойност в карта.
  • find (val) - Тази функция дава итератор на елемента val, ако е намерен. В противен случай ще върне m.end ().
  • Изтриване (позиция на итератор) - Тази функция изтрива елемента в позицията, посочена от итератора.
  • изтриване (const g) - Тази функция изтрива ключ-стойност g от карта.
  • Clear () - Тази функция изтрива всички елементи от карта.

Итерация над елементите на картата

Можете да прегледате елементите на картата. Просто трябва да създадем итератор и да го използваме за това. Например:

Пример 1:

#include #include #include using namespace std;int main() {map Students;Students.insert(std::pair(200, "Alice"));Students.insert(std::pair(201, "John"));cout << "Map size is: " << Students.size() << endl;cout << endl << "Default map Order is: " << endl;for (map::iterator it = Students.begin(); it != Students.end(); ++it) {cout << (*it).first << ": " << (*it).second << endl;}}

Изход:

Ето екранна снимка на кода:

Обяснение на кода:

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

Вмъкване на данни в std :: map

Можете да въвеждате елементи в std :: map с помощта на функцията insert (). Не забравяйте, че ключовете std :: map трябва да са уникални.

И така, първо проверява дали всеки ключ присъства в картата. Ако присъства, записът няма да бъде вмъкнат, но връща итератора за съществуващия запис. Ако не присъства, записът се вмъква.

Функцията има следните вариации:

  • вмъкване (двойка) - с тази вариация в картата се вмъква двойка ключ-стойност.
  • вмъкване (start_itr, end_itr) - с тази вариация записите ще бъдат вмъкнати в обхвата, определен от start_itr и end_itr от друга карта.

Функцията insert_or_assing () работи по същия начин като функцията insert (), но ако даденият ключ вече съществува в картата, стойността му ще бъде променена.

Пример 2:

#include #include using namespace std;int main() {map 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;}

Изход:

Ето екранна снимка на кода:

Обяснение на кода:

  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. Използвайте цикъл for, за да създадете итератор с име itr, за да прегледате елементите на картата с име m.
  11. Отпечатайте стойностите на картата m на конзолата. Символът "\ t" създава хоризонтално интервал между всеки ключ и съответната му стойност. За разлика от тях, символът "\ n" премества курсора на мишката към следващия ред след всяка итерация.
  12. Край на тялото на цикъла за.
  13. Програмата трябва да върне стойност при успешно завършване.
  14. Край на тялото на основната () функция.

Търсене в карта

Можем да използваме функцията find (), за да търсим елементи в карта по техните ключове. Ако ключът не е намерен, функцията връща std :: map :: end. В противен случай ще бъде върнат итератор на търсения елемент.

Пример 2:

#include #include #include using namespace std;int main() {map Students;Students.insert(std::pair(200, "Alice"));Students.insert(std::pair(201, "John"));std::map::iterator it = Students.find(201);if (it != Students.end()) {std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';}}

Изход:

Ето екранна снимка на кода:

Обяснение на кода:

  1. Включете заглавния файл на iostream в нашия код, за да използвате неговите функции, без да получавате грешки.
  2. Включете заглавния файл на низа в нашия код, за да използвате неговите функции без да получавате грешки.
  3. Включете заглавния файл на картата в нашия код, за да използвате неговите функции, без да получавате грешки.
  4. Включете std пространството от имена в нашия код, за да използвате неговите класове, без да го извиквате.
  5. Извикайте функцията main (). {Отбелязва началото на тялото на main () функция.
  6. Създайте карта с име Студенти, чиито ключове ще бъдат цели числа и низове от стойности.
  7. Поставете стойности в картата Студенти. Ключ от 200 и стойност на Алиса ще бъдат вмъкнати в картата.
  8. Поставете стойности в картата Студенти. Ключ от 201 и стойност на Джон ще бъдат вмъкнати в картата.
  9. Потърсете стойността, свързана с ключ от 201.
  10. Използвайте оператор if, за да проверите дали е намерена стойността за ключа.
  11. Отпечатайте стойността на ключа заедно с някакъв текст на конзолата.
  12. Край на тялото на оператора if.
  13. Край на тялото на основната () функция.

Изтриване на данни от карта

Можем да използваме функцията erase (), за да изтрием стойност от карта. Ние просто създаваме итератор, който сочи към елемента, който трябва да бъде изтрит. След това итераторът се предава на функцията erase ().

Пример 3:

#include #include #include using namespace std;int main() {map my_map;my_map.insert(std::make_pair("cow", 1));my_map.insert(std::make_pair("cat", 2));my_map["lion"] = 3;map::iterator it = my_map.find("cat");my_map.erase(it);for (map::iterator it = my_map.begin(); it != my_map.end(); ++it)cout << (*it).first << ": " << (*it).second << endl;return 0;}

Изход:

Ето екранна снимка на кода:

Обяснение на кода:

  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. Край на тялото на основната () функция.

Резюме:

  • Картата е асоциативен контейнер, който съхранява елементи в картографирана форма.
  • Всеки елемент в картата има ключова стойност и картографирана стойност.
  • В карта две картографирани стойности не могат да споделят ключови стойности.
  • Ключовите стойности помагат при сортирането и идентифицирането на елементи по уникален начин.
  • Картираните стойности помагат за съхраняване на съдържание, свързано с ключа.
  • Картата C ++ съхранява уникални ключове в сортиран ред.
  • За да работим със С ++ карта, ние създаваме итератор за итерация над елементите.
  • С итератора можем да изпълняваме задачи като търсене и изтриване на елементи от картата.