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.

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:
Oto zrzut ekranu kodu:
Code Wyjaśnienie:
- Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy ciągu znaków do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main(). { oznacza początek treści funkcji.
- Utwórz mapę o nazwie Studenci, w której klucze będą liczbami całkowitymi, a wartościami będą ciągi znaków.
- Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 200 i wartość Alice.
- Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 201 i wartość John.
- Użyj funkcji size(), aby uzyskać rozmiar mapy o nazwie Students. Powinno to zwrócić wartość 2.
- Wydrukuj tekst na konsoli.
- Użyj pętli for, aby utworzyć iterator o nazwie iterator, który umożliwi iterację po elementach mapy o nazwie Studenci.
- Wydrukuj wartości mapy Studenci na konsoli.
- Koniec treści pętli for.
- 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:
Oto zrzut ekranu kodu:
Code Wyjaśnienie:
- Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main(). { oznacza początek treści funkcji.
- 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.
- Wstaw nowy wpis do mapy m. Do mapy zostanie wstawiony klucz 5 i wartość 6.
- Próbuję dokonać wpisu do już istniejącego klucza. Ponieważ klucz 1 już istnieje na mapie, wpis nie zostanie dokonany.
- Użyj funkcji insert_or_assign(), aby wstawić lub zmodyfikować istniejący wpis. Ponieważ klucz 1 już istnieje, jego wartość zostanie zmieniona na 6.
- Wydrukuj tekst na konsoli. Znak „\t” tworzy poziomą spację, natomiast znak „\n” przesuwa kursor myszy do następnej linii.
- Użyj dla pętli aby utworzyć iterator o nazwie itr, aby iterować po elementach mapy o nazwie m.
- 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.
- Koniec treści pętli for.
- Program musi zwrócić wartość po pomyślnym zakończeniu.
- 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:
Oto zrzut ekranu kodu:
Code Wyjaśnienie:
- Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji bez występowania błędów.
- 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.
- Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji bez występowania błędów.
- Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main(). Znak { oznacza początek treści funkcji main().
- Utwórz mapę o nazwie Studenci, której klucze będą liczbami całkowitymi i ciągami wartości.
- Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 200 i wartość Alice.
- Wstaw wartości na mapę. Studenci. Do mapy zostanie wstawiony klucz 201 i wartość John.
- Poszukaj wartości powiązanej z kluczem 201.
- Użyj instrukcji if, aby sprawdzić, czy została znaleziona wartość klucza.
- Wydrukuj wartość klucza obok tekstu na konsoli.
- Koniec treści instrukcji if.
- 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:
Oto zrzut ekranu kodu:
Code Wyjaśnienie:
- Dołącz plik nagłówkowy iostream do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy ciągu znaków do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy mapy do naszego kodu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego kodu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main(). Znak { oznacza początek treści funkcji main().
- Utwórz mapę o nazwie moja_mapa, której klucze będą ciągami znaków, a wartościami całkowitymi.
- Wstaw wartości do mapy my_map. Do mapy zostanie wstawiony klucz Krowy i wartość 1.
- Wstaw wartości do mapy my_map. Do mapy zostanie wstawiony klucz Cat i wartość 2.
- Dodaj wartość 3 do mapy my_map za pomocą klucza lwa.
- Utwórz iterator, aby iterować po mapie my_map w poszukiwaniu kluczowego kota.
- Usuń element wskazany przez iterator.
- Użyj iteratora, aby przejść przez elementy mapy my_map od początku do końca.
- Wydrukuj zawartość mapy my_map na konsoli.
- Program musi zwrócić dane wyjściowe po pomyślnym zakończeniu.
- Koniec treści funkcji main().






