Mapa w C++ Standardowa biblioteka szablonów (STL)
W czym jest Mapa C++? Składnia
In C++, A MAP to kontener asocjacyjny przechowujący elementy w zmapowanej formie. Każdy element na mapie składa się z pary klucz-wartość i mapowanej wartości. Dwie zmapowane wartości nie mogą mieć tych samych wartości kluczy.
Wartości kluczy są dobre do sortowania i jednoznacznej identyfikacji elementów. Zamapowane wartości służą do przechowywania treści powiązanej z kluczem. Obydwa mogą różnić się typami, ale typ elementu członkowskiego łączy je za pomocą typu pary, który łączy oba.
Po co używać std::map?
Oto powody, dla których warto korzystać z mapy:
- std:: map przechowuje unikalne klucze tylko w kolejności posortowanej na podstawie wybranych kryteriów sortowania.
- Wyszukiwanie elementów za pomocą klawisza jest łatwe i szybsze.
- 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 drzew binarnych (zrównoważonych).
Składnia
Aby zadeklarować std::map, użyj tej składni:
std::map<key_datatype, value_datatype>map_name;
- Kurs
key_datatype
oznacza typ danych kluczy mapy. - Kurs
value_datatype
oznacza typ danych wartości odpowiadających kluczom mapy. - Kurs
map_name
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 klucz typy danych i liczby całkowite jako wartości typ danych.
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 do mapy nową parę klucz-wartość.
- znajdź(wartość) – Ta funkcja podaje iterator do elementu val, jeśli zostanie znaleziony. W przeciwnym wypadku zwróci m.end().
- Usuń (pozycja iteratora) – Funkcja ta usuwa element z pozycji wskazanej przez iterator.
- usuń (stała g) – Ta funkcja usuwa parę klucz-wartość g z mapy.
- Jasne () -Ta funkcja usuwa wszystkie elementy z mapy.
Iteracja po elementach mapy
Można iterować po elementach mapy. Musimy po prostu utworzyć iterator i użyć go do tego.
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:
Wyjaśnienie kodu:
- 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.
- Zadzwoń do
main()
funkcjonować. { 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
size()
funkcję, aby uzyskać rozmiar mapy o nazwie Studenci. To powinno zwrócić 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 korpusu
main()
funkcja.
Wstawianie danych do std::map
Możesz wprowadzać elementy do std::map za pomocą insert()
funkcjonować. Pamiętaj, że klucze std::map muszą być unikalne.
Najpierw sprawdza więc, czy każdy klucz jest obecny na mapie. Jeśli jest obecny, wpis nie zostanie wstawiony, ale zwróci iterator dla istniejącego wpisu. Jeśli go nie ma, wpis jest wstawiany.
Funkcja ta ma następujące warianty:
- włóż (para) – w przypadku tej odmiany do mapy wstawiana jest para klucz-wartość.
- wstaw(start_itr, koniec_itr) – w tej odmianie wpisy zostaną wstawione w zakresie zdefiniowanym przez start_itr i end_itr z innej mapy.
Kurs wstaw_lub_assing() funkcja działa w taki sam sposób jak insert()
funkcję, 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:
Wyjaśnienie kodu:
- 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.
- Zadzwoń do
main()
funkcjonować. { 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.
- Korzystanie z
insert_or_assign()
funkcję wstawiania lub modyfikowania istniejącego wpisu. 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 ciała pętli for.
- Program musi zwrócić wartość po pomyślnym zakończeniu.
- Koniec korpusu
main()
funkcja.
Wyszukiwanie na mapie
Możemy użyć find()
funkcja wyszukiwania elementów na mapie według ich kluczy. Jeśli klucz nie zostanie znaleziony, funkcja zwraca std::map::end. W przeciwnym wypadku 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:
Wyjaśnienie kodu:
- 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.
- Zadzwoń do
main()
funkcjonować. { oznacza początek treścimain()
funkcja. - 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 korpusu
main()
funkcja.
Usuwanie danych z mapy
Możemy użyć erase()
funkcja usuwania wartości z mapy. Po prostu tworzymy iterator wskazujący element do usunięcia. Iterator jest następnie przekazywany do erase()
funkcja.
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:
Wyjaśnienie kodu:
- 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.
- Zadzwoń do
main()
funkcjonować. { oznacza początek treścimain()
funkcja. - 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 iterować po elementach 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 korpusu
main()
funkcja.
Podsumowanie
- Mapa to skojarzony kontener przechowujący elementy w zmapowanej formie.
- Każdy element na mapie ma wartość kluczową i mapowaną wartość.
- Na mapie dwie zmapowane wartości nie mogą mieć wspólnych wartości kluczowych.
- Wartości kluczy pomagają w sortowaniu i jednoznacznej identyfikacji elementów.
- Zmapowane wartości pomagają w przechowywaniu treści powiązanej z kluczem.
- C++ map przechowuje unikalne klucze w posortowanej kolejności.
- Pracować z C++ map, tworzymy iterator do iteracji po elementach.
- Za pomocą iteratora możemy wykonywać zadania, takie jak wyszukiwanie i usuwanie elementów na mapie.