Mapa w C++ Standardowa biblioteka szablonów (STL)

⚡ Inteligentne podsumowanie

Mapa w C++ jest asocjacyjnym kontenerem ze standardowej biblioteki szablonów, który przechowuje elementy jako posortowane pary klucz-wartość, gdzie każdy unikalny klucz jest odwzorowywany na jedną wartość, i umożliwia szybkie wyszukiwanie, wstawianie i przeglądanie w sposób uporządkowany.

  • 🗺️. Kontener asocjacyjny: A C++ mapa przechowuje elementy jako pary klucz-wartość z unikalnymi, automatycznie sortowanymi kluczami.
  • 🧩 Nagłówek i składnia: Dodaj nagłówek mapy, a następnie zadeklaruj std::map nazwa do przechowywania wpisanych par.
  • 🛠️. Wbudowane funkcje: Zawartość mapy można zarządzać za pomocą begin(), size(), empty(), insert(), find(), erase() i clear().
  • 🔄 Iteracja: Dwukierunkowy iterator przeszukuje elementy mapy w posortowanej kolejności kluczy w celu odczytania lub usunięcia.
  • 🔑 Unikalne klucze: Dwa elementy nie mogą dzielić klucza, co sprawia, że ​​mapa idealnie nadaje się jako tablica asocjacyjna.
  • 🤖 Pomoc AI: GitHub Copilot i podobne narzędzia wspomagające sztuczną inteligencję budują deklaracje map i pętle na podstawie krótkiego komentarza.

Mapa w C++ STL

W czym jest Mapa C++?

In C++MAP to asocjacyjny kontener przechowujący elementy w formie mapowanej. Każdy element na mapie składa się z wartości klucza i wartości mapowanej. Dwie mapowane wartości nie mogą mieć tych samych wartości klucza.

Wartości kluczowe są przydatne do sortowania i jednoznacznej identyfikacji elementów, podczas gdy wartości mapowane przechowują zawartość powiązaną z każdym kluczem. Mogą one różnić się typem, ale typ elementu łączy je w parę, która zawiera oba.

Przed napisaniem jakiegokolwiek kodu warto wiedzieć, dlaczego mapa jest często właściwym pojemnikiem, po który warto sięgnąć.

Po co używać std::map?

Oto powody, dla których warto korzystać z mapy:

  • std::map przechowuje wyłącznie unikalne klucze, w kolejności posortowanej na podstawie wybranych kryteriów sortowania.
  • Wyszukiwanie pierwiastków za pomocą klucza jest łatwe i szybkie.
  • Do każdego klawisza dołączony jest tylko jeden element.
  • std::map może służyć jako tablica asocjacyjna.
  • std::map można zaimplementować przy użyciu zrównoważonych drzew binarnych.

Aby skorzystać z tych korzyści, należy zacząć od składni deklaracji.

Składnia

Aby zadeklarować std::map, użyj tej składni:

std::map<key_datatype, value_datatype>map_name; 
  • typ_danych_klucza oznacza typ danych kluczy mapy.
  • typ_danych_wartości oznacza typ danych wartości odpowiadających kluczom mapy.
  • nazwa_mapy to nazwa mapy.

Na przykład:

map<string, int> my_map; 

Zadeklarowaliśmy mapę o nazwie my_map. Mapa będzie miała ciąg znaków jako typ danych klucza i liczbę całkowitą jako typ danych wartości.

Typy członków

Funkcje członkowskie mogą używać następujących typów członkowskich jako parametrów lub typów zwracanych:

  • typ klucza: Klucz (pierwszy parametr w szablonie)
  • mapowany typ: T (drugi parametr w szablonie)
  • porównanie_kluczy: Porównaj (trzeci parametr w szablonie)
  • typ_alokatora: Alloc (czwarty parametr w szablonie)
  • typ wartości: para
  • porównanie_wartości: Zagnieżdżona klasa funkcji do porównywania elementów
  • Numer referencyjny: typ_alokatora::referencja
  • const_reference: allocator_type::const_reference
  • wskaźnik: typ_alokatora::wskaźnik
  • const_pointer: typ_alokatora::const_pointer
  • iterator: dwukierunkowy iterator do typu wartości
  • const_iterator: dwukierunkowy iterator do stałego typu wartości
  • odwrotny_iterator: iterator odwrotny
  • const_reverse_iterator: stały iterator odwrotny
  • typ_różnicy: ptrdiff_t
  • typ_rozmiaru: rozmiar_t

Wbudowane funkcje std::map

std::map ma wbudowane funkcje. Niektóre z nich obejmują:

  • zaczynać () – Ta funkcja zwraca iterator do pierwszego elementu mapy.
  • rozmiar() – Ta funkcja zwraca liczbę elementów na mapie.
  • pusty() – Ta funkcja zwraca wartość logiczną oznaczającą, czy mapa jest pusta.
  • wstaw(para(klucz, wartość)) – Ta funkcja wstawia nową parę klucz-wartość do mapy.
  • znajdź(wartość) – Ta funkcja zwraca iterator do elementu val, jeśli zostanie znaleziony. W przeciwnym razie zwraca m.end().
  • wymazywanie(pozycja iteratora) – Ta funkcja usuwa element w pozycji wskazywanej przez iterator.
  • usuń (stała g) – Ta funkcja usuwa wartość kluczową g z mapy.
  • jasny() – Ta funkcja usuwa wszystkie elementy z mapy.

Po zdefiniowaniu funkcji przechodzimy do kolejnych przykładów, w których wprowadzamy je w życie, zaczynając od iteracji.

Iteracja po elementach mapy

Możesz iterować po elementach mapy. Wystarczy utworzyć iterator i go w tym celu użyć. Na przykład:

1 przykład

#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;
	}
}

Wyjście:

C++ iteracja mapy Przykład 1 wyjście

Oto zrzut ekranu kodu:

C++ iteracja mapy Przykład 1 kod

Code Wyjaśnienie:

  1. Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
  2. Dołącz plik nagłówkowy ciągu znaków do naszego kodu, aby móc korzystać z jego funkcji.
  3. Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji.
  4. Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
  5. Wywołaj funkcję main(). { oznacza początek treści funkcji.
  6. Utwórz mapę o nazwie Studenci, w której klucze będą liczbami całkowitymi, a wartościami będą ciągi znaków.
  7. Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 200 i wartość Alice.
  8. Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 201 i wartość John.
  9. Użyj funkcji size(), aby uzyskać rozmiar mapy o nazwie Students. Powinno to zwrócić wartość 2.
  10. Wydrukuj tekst na konsoli.
  11. Użyj pętli for, aby utworzyć iterator o nazwie iterator, który umożliwi iterację po elementach mapy o nazwie Studenci.
  12. Wydrukuj wartości mapy Studenci na konsoli.
  13. Koniec treści pętli for.
  14. Koniec treści funkcji main().

Wstawianie danych do std::map

Możesz wprowadzać elementy do std::map za pomocą funkcji insert(). Pamiętaj, że klucze std::map muszą być unikalne.

Najpierw sprawdza, czy każdy klucz jest obecny na mapie. Jeśli jest obecny, wpis nie zostanie wstawiony, ale zwraca iterator dla istniejącego wpisu. Jeśli nie jest obecny, wpis zostaje wstawiony.

Funkcja ta ma następujące warianty:

  • wstaw(parę) – w tym wariancie do mapy wstawiana jest para klucz-wartość.
  • wstaw(start_itr, end_itr) – w tej wersji wpisy będą wstawiane w zakresie zdefiniowanym przez start_itr i end_itr z innej mapy.

Funkcja insert_or_assign() działa w taki sam sposób jak funkcja insert(), ale jeśli dany klucz już istnieje na mapie, jego wartość zostanie zmodyfikowana.

2 przykład

#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;
}

Wyjście:

C++ wstawianie mapy Przykład 2 wyjście

Oto zrzut ekranu kodu:

C++ przykład 2 kodu wstawiania mapy

Code Wyjaśnienie:

  1. Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji.
  2. Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
  3. Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
  4. Wywołaj funkcję main(). { oznacza początek treści funkcji.
  5. Utwórz mapę o nazwie m, w której klucze będą liczbami całkowitymi, a wartości będą liczbami całkowitymi. Na mapie dokonano trzech wpisów.
  6. Wstaw nowy wpis do mapy m. Do mapy zostanie wstawiony klucz 5 i wartość 6.
  7. Próbuję dokonać wpisu do już istniejącego klucza. Ponieważ klucz 1 już istnieje na mapie, wpis nie zostanie dokonany.
  8. Użyj funkcji insert_or_assign(), aby wstawić lub zmodyfikować istniejący wpis. Ponieważ klucz 1 już istnieje, jego wartość zostanie zmieniona na 6.
  9. Wydrukuj tekst na konsoli. Znak „\t” tworzy poziomą spację, natomiast znak „\n” przesuwa kursor myszy do następnej linii.
  10. Użyj dla pętli aby utworzyć iterator o nazwie itr, aby iterować po elementach mapy o nazwie m.
  11. Wydrukuj wartości mapy m na konsoli. Znak „\t” tworzy poziomą spację pomiędzy każdym klawiszem a odpowiadającą mu wartością. Natomiast znak „\n” przesuwa kursor myszy do następnej linii po każdej iteracji.
  12. Koniec treści pętli for.
  13. Program musi zwrócić wartość po pomyślnym zakończeniu.
  14. Koniec treści funkcji main().

Wyszukiwanie na mapie

Możemy użyć funkcji find(), aby wyszukać elementy na mapie według ich kluczy. Jeśli klucz nie zostanie znaleziony, funkcja zwraca std::map::end. W przeciwnym razie zostanie zwrócony iterator szukanego elementu.

3 przykład

#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';
	}
}

Wyjście:

C++ mapa znajdź szukaj Przykład 3 wyjście

Oto zrzut ekranu kodu:

C++ mapa znajdź szukaj przykład kodu 3

Code Wyjaśnienie:

  1. Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji bez występowania błędów.
  2. Dołącz plik nagłówkowy ciągu znaków do naszego kodu, aby móc korzystać z jego funkcji bez występowania błędów.
  3. Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji bez występowania błędów.
  4. Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
  5. Wywołaj funkcję main(). Znak { oznacza początek treści funkcji main().
  6. Utwórz mapę o nazwie Studenci, której klucze będą liczbami całkowitymi i ciągami wartości.
  7. Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 200 i wartość Alice.
  8. Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 201 i wartość John.
  9. Poszukaj wartości powiązanej z kluczem 201.
  10. Użyj instrukcji if, aby sprawdzić, czy została znaleziona wartość klucza.
  11. Wydrukuj wartość klucza obok tekstu na konsoli.
  12. Koniec treści instrukcji if.
  13. Koniec treści funkcji main().

Usuwanie danych z mapy

Możemy użyć funkcji era(), aby usunąć wartość z mapy. Po prostu tworzymy iterator wskazujący na element do usunięcia. Iterator jest następnie przekazywany do funkcji era().

4 przykład

#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;
}

Wyjście:

C++ mapa wymazywanie usuń przykład 4 wyjście

Oto zrzut ekranu kodu:

C++ mapa wymazuje usuń przykład kodu 4

Code Wyjaśnienie:

  1. Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
  2. Dołącz plik nagłówkowy ciągu znaków do naszego kodu, aby móc korzystać z jego funkcji.
  3. Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji.
  4. Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
  5. Wywołaj funkcję main(). Znak { oznacza początek treści funkcji main().
  6. Utwórz mapę o nazwie moja_mapa, której klucze będą ciągami znaków, a wartościami całkowitymi.
  7. Wstaw wartości do mapy my_map. Do mapy zostanie wstawiony klucz Krowy i wartość 1.
  8. Wstaw wartości do mapy my_map. Do mapy zostanie wstawiony klucz Cat i wartość 2.
  9. Dodaj wartość 3 do mapy my_map za pomocą klucza lwa.
  10. Utwórz iterator, aby iterować po mapie my_map w poszukiwaniu kluczowego kota.
  11. Usuń element wskazany przez iterator.
  12. Użyj iteratora, aby przejść przez elementy mapy my_map od początku do końca.
  13. Wydrukuj zawartość mapy my_map na konsoli.
  14. Program musi zwrócić dane wyjściowe po pomyślnym zakończeniu.
  15. Koniec treści funkcji main().

FAQ

std::map sortuje klucze za pomocą samobalansującego się binarnego drzewa wyszukiwania, co pozwala na wykonanie O(log n) operacji. std::unordered_map używa tablicy haszującej do średnio O(1) wyszukiwań, ale przechowuje klucze w dowolnej kolejności. Wybierz opcję w zależności od potrzeb.

Typ std::map jest zazwyczaj implementowany jako samobalansujące się binarne drzewo wyszukiwania, najczęściej drzewo czerwono-czarne. Utrzymuje to klucze w posortowanej kolejności i gwarantuje logarytmiczny czas operacji wstawiania, usuwania i wyszukiwania.

Nie. Mapa std::map przechowuje tylko unikatowe klucze, więc wstawienie istniejącego klucza nie powoduje jego nadpisania. Gdy wymagane są zduplikowane klucze, należy użyć struktury std::multimap, która pozwala wielu elementom współdzielić tę samą wartość klucza.

Użyj map_name[key] do odczytu lub przypisania wartości; operator indeksu dolnego wstawia domyślny wpis, jeśli klucz jest brakujący. Element at() zgłasza wyjątek w przypadku braku klucza, co czyni go bezpieczniejszym wyborem.

Przekaż niestandardowy komparator jako trzeci argument szablonu, taki jak std::map >. Większy komparator porządkuje klucze od najwyższego do najniższego, zamiast domyślnej kolejności rosnącej.

Mapa std::map przechowuje pary klucz-wartość i wyszukuje wartości według klucza, podczas gdy zestaw std::set przechowuje tylko unikatowe klucze bez przypisanej wartości. Oba typy map sortują elementy, ale mapa kojarzy dane z każdym kluczem.

Tak. Asystenci kodowania AI przekształcają krótki monit lub komentarz w działający kod std::map, w tym deklaracje, wywołania insertów i pętle iteratorów. Zawsze sprawdzaj wygenerowane typy kluczy, kolejność i przypadki brzegowe przed kompilacją.

Tak. Drugi pilot GitHub Sugeruje deklaracje map, wywołania insert i find oraz iteracyjne pętle podczas pisania. Dobrze radzi sobie z powtarzalnymi szablonami, choć przed kompilacją nadal należy zweryfikować unikalność kluczy i logikę.

Podsumuj ten post następująco: