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

⚡ Умно обобщение

Карта в C++ е асоциативен контейнер от библиотеката със стандартни шаблони, който съхранява елементи като сортирани двойки ключ-стойност, където всеки уникален ключ съответства на една стойност и позволява бързо търсене, вмъкване и подредено преминаване.

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

Карта в C++ STL

В какво е Map C++?

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

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

Преди да напишете какъвто и да е код, е полезно да знаете защо картата често е правилният контейнер, към който да посегнете.

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

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

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

За да използвате тези предимства, започнете със синтаксиса на декларациите.

Синтаксис

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

std::map<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;
	}
}

Изход:

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 цикъл, за да създадете итератор, наречен той, за да обхожда елементите на картата, наречени Students.
  12. Отпечатайте стойностите на картата Students на конзолата.
  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] за четене или присвояване на стойност; операторът subscript вмъква запис по подразбиране, ако ключът липсва. Членът at() хвърля изключение за липсващи ключове, което го прави по-безопасен избор.

Предайте персонализиран сравнител като трети аргумент на шаблона, например std::map >. По-големият сравнител подрежда ключовете от най-висок към най-нисък, вместо във възходящ ред по подразбиране.

std::map съхранява двойки ключ-стойност и търси стойности по ключ, докато std::set съхранява само уникални ключове без асоциирана стойност. И двата метода поддържат елементите сортирани, но map свързва данни с всеки ключ.

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

Да. Копилот на GitHub Предлага декларации на map, извиквания на insert и find, както и итерационни цикли, докато пишете. Справя се добре с повтарящи се шаблонни елементи, въпреки че все пак трябва да проверите уникалността и логиката на ключовете, преди да ги изградите.

Обобщете тази публикация с: