Klasa i przedmioty
Klasa to zbiór współpracujących ze sobą zmiennych i funkcji, przy czym zmienne nie mają przypisanych wartości. Kiedy wartości są przypisane do zmiennych, klasa staje się obiektem. Różne wartości przypisane do tej samej klasy skutkują różnymi obiektami; czyli różne obiekty są tą samą klasą o różnych wartościach. Mówi się, że tworzenie obiektu z klasy jest tworzeniem instancji obiektu.
Nazwa unordered_map to klasa. Obiekt utworzony z klasy unordered_map ma wybraną nazwę programisty.
Funkcja należąca do klasy jest potrzebna do utworzenia instancji obiektu z klasy. W C++ ta funkcja ma taką samą nazwę jak nazwa klasy. Obiekty tworzone (instancja) z klasy mają różne nazwy nadawane im przez programistę.
Tworzenie obiektu z klasy oznacza konstruowanie obiektu; oznacza to również tworzenie instancji.
Program w C++, który używa klasy unordered_map, zaczyna się następującymi wierszami na początku pliku:
#zawierać#zawierać
przy użyciu standardowej przestrzeni nazw;
Pierwsza linia dotyczy wejścia/wyjścia. Druga linia to umożliwienie programowi wykorzystania wszystkich cech klasy unordered_map. Trzecia linia pozwala programowi na używanie nazw ze standardowej przestrzeni nazw.
Przeciążanie funkcji
Gdy dwie lub więcej różnych sygnatur funkcji ma tę samą nazwę, mówi się, że nazwa ta jest przeciążona. Gdy wywoływana jest jedna funkcja, liczba i typ argumentów określają, która funkcja jest faktycznie wykonywana.
Konstruowanie/kopiowanie Konstruowanie
Prosta konstrukcja
Nieuporządkowaną mapę można skonstruować i przypisać jej wartości w następujący sposób:
unordered_mapumap["banan"] = "żółty";
umap["winogrona"] = "zielony";
umap["fig"] = "fioletowy";
Deklaracja zaczyna się od specjalizacji szablonu z typami dla par klucz i wartość. Po nim następuje nazwa mapy wybrana przez programistę; potem średnik. Drugi segment kodu pokazuje, jak przypisać wartości do ich klawiszy.
Budowa przez Initializer_list
Można to zrobić w następujący sposób:
"winogron", "zielony", "fig", "fioletowy");
Konstruowanie przez przypisanie Initializer_list
Przykład:
"winogron", "zielony", "fig", "fioletowy";
Konstruowanie przez kopiowanie innej unordered_map
Przykład:
"winogron", "zielony", "fig", "fioletowy");
unordered_map
Para Element
Poniższy kod pokazuje, jak utworzyć i uzyskać dostęp do elementu pair:
paraCout << pr.first << '\n';
Cout << pr.second << '\n';
Dane wyjściowe to:
remorze
pierwszy i drugi są zarezerwowanymi słowami dla dwóch przedmiotów w parze. Wartości w parze można nadal zmieniać za pomocą pierwszego i drugiego.
Para jest wywoływana, value_type w temacie mapy nieuporządkowanej.
unordered_map Dostęp do elementu
mapped_type& operator[](key_type&& k)
Zwraca wartość odpowiedniego klucza. Przykład:
umap["banan"] = "żółty";
umap["winogrona"] = "zielony";
umap["fig"] = "fioletowy";
const char *ret = umap["winogrono"];
Cout << ret <<'\n';
Wyjście to: „zielony”. Wartości można przypisać w ten sam sposób - patrz wyżej.
unordered_map Pojemność
size_type size() const noexcept
Zwraca liczbę par na mapie.
umap["banan"] = "żółty";
umap["winogrona"] = "zielony";
umap["fig"] = "fioletowy";
Cout << umap.size() <<'\n';
Wyjście to 3.
bool empty() const noexcept
Zwraca 1 dla prawdy, jeśli mapa nie ma pary, i 0 dla fałszu, jeśli ma pary. Przykład:
unordered_mapCout << umap.empty() <<'\n';
Wyjście to 1.
Powracające iteratory i klasa nieuporządkowanej mapy
Iterator jest jak wskaźnik, ale ma większą funkcjonalność niż wskaźnik.
begin() bez wyjątku
Zwraca iterator wskazujący na pierwszą parę obiektu mapy, jak w następującym segmencie kodu:
unordered_mapumap["banan"] = "żółty"; umap["winogrona"] = "zielony"; umap["fig"] = "fioletowy";
unordered_map
para
Cout << pr.first << ", " << pr.second << '\n';
Dane wyjściowe to: rys, fioletowy. Mapa jest nieuporządkowana.
begin() const noexcept;
Zwraca iterator wskazujący na pierwszy element kolekcji obiektów map. Gdy konstrukcję obiektu poprzedza const, zamiast „begin()” wykonywane jest wyrażenie „begin() const”. Pod tym warunkiem elementy w obiekcie nie mogą być modyfikowane. Jest używany w następującym kodzie, na przykład.
const unordered_map"winogron", "zielony", "fig", "fioletowy");
unordered_map
para
Cout << pr.first << ", " << pr.second << '\n';
Dane wyjściowe to: rys, fioletowy. Mapa jest nieuporządkowana. Zauważ, że tym razem const_iterator został użyty, a nie tylko iterator, aby otrzymać zwrócony iterator.
end() bez wyjątku
Zwraca iterator, który wskazuje bezpośrednio za ostatni element obiektu mapy.
end() const noexcept
Zwraca iterator, który wskazuje bezpośrednio za ostatni element obiektu mapy. Gdy konstrukcja obiektu mapy jest poprzedzona przez const, zamiast „end()” wykonywane jest wyrażenie „end() const”.
unordered_map Operacje
iterator znajdź (const key_type& k)
Wyszukuje parę danego klucza na mapie. Jeśli zostanie znaleziony, zwraca iterator. Jeśli nie zostanie znaleziony, zwraca iterator wskazujący koniec mapy, który nie jest parą. Poniższy kod pokazuje, jak używać tej funkcji członkowskiej:
unordered_mapumap['a'] = 'b'; umap['c'] = 'd'; umap['e'] = 'f';
unordered_map
jeśli (umap.znajdź('c') != umap.koniec())
para
Cout << pr.first << ", " << pr.second << '\n';
Dane wyjściowe to: c, d
const_iterator find(const key_type& k) const;
Ta wersja funkcji jest wywoływana, jeśli tworzenie mapy nieuporządkowanej rozpoczyna się od const, czyniąc wszystkie elementy mapy tylko do odczytu.
unordered_map Modyfikatory
para
Nieuporządkowana mapa oznacza, że pary nie są w żadnej kolejności. Tak więc program wstawia parę w dowolne miejsce, które uważa za wygodne. Funkcja zwraca, para
umap["banan"] = "żółty";
umap["winogrona"] = "zielony";
umap["fig"] = "fioletowy";
umap.insert("wiśnia", "czerwony", "truskawka", "czerwony");
Cout << umap.size() << '\n';
Wyjście to: 5. Można wstawić więcej niż jedną parę.
size_type erase(const key_type& k)
Ta funkcja usuwa parę z unordered_map. Poniższy segment kodu ilustruje:
unordered_mapumap["banan"] = "żółty";
umap["winogrona"] = "zielony";
umap["fig"] = "fioletowy";
liczba int = umap.wymazać("winogrona");
Cout << umap.size() << '\n';
Wyjście to 2.
zamiana nieważnych(unordered_map&)
Dwie nieuporządkowane mapy można zamienić, jak pokazano w tym segmencie kodu:
"winogron", "zielony", "fig", "fioletowy", "truskawka", "czerwony";
unordered_map
umap1.swap(umap2);
unordered_map
para
unordered_map
para
Cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
Cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
unordered_map
"winogron", "zielony", "fig", "fioletowy", "truskawka", "czerwony";
unordered_map
umap1.swap(umap2);
unordered_map
para
unordered_map
para
Cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
Cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
Dane wyjściowe to:
Pierwszy klucz i rozmiar umap1: limonka, 2
Pierwszy klucz i rozmiar truskawki umap2, 4
Mapa jest nieuporządkowana. Pamiętaj, że w razie potrzeby długość mapy jest zwiększana. Typy danych muszą być takie same.
Klasa i jej obiekty instancyjne
Wartość odnosi się do typu danych, tak jak skonkretyzowany obiekt do klasy. Nieuporządkowana konstrukcja mapy może również akceptować klasę jako typ danych. Poniższy program ilustruje to:
#zawierać#zawierać
przy użyciu standardowej przestrzeni nazw;
klasa TheCla
publiczny:
liczba wewnętrzna;
znak statyczny;
void func (char cha, const char *str)
Cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
static void fun (char ch)
jeśli (ch == 'a')
Cout << "Official static member function" << '\n';
;
int main()
TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
unordered_map
umap = "banan", obj1, "winogrono", obj2, "fig", obj3, "truskawka", obj4, "limonka", obj5;
Cout << umap.size() << '\n';
zwróć 0;
Wyjście to: 5.
Definicja klasy ma dwa publiczne składowe danych i dwie publiczne funkcje składowe. W funkcji main() tworzone są różne obiekty dla klasy. Następnie tworzona jest nieuporządkowana mapa, w której każda para składa się z nazwy owocu i obiektu z klasy. Wyświetlany jest rozmiar mapy. Program kompiluje się bez ostrzeżenia ani komunikatu o błędzie.
Zastosowanie mapy
Tablica przypisuje indeks do wartości. Pary klucz/wartość istnieją w wielu sytuacjach życiowych, które można zaprogramować. Para klucz/wartość owoc/kolor to tylko jeden przykład. Innym przykładem są nazwiska osób i ich wiek. W tym przypadku para będzie typu para
Tworzenie mapy
Mapa nie jest dwuwymiarową tablicą z dwiema kolumnami. Mapa działa z funkcją skrótu. Klucz jest zakodowany przez funkcję haszującą w postaci liczby całkowitej tablicy. To właśnie ta tablica przechowuje wartości. Tak więc w rzeczywistości istnieje jedna tablica z wartościami, a klucze są mapowane na indeksy tablicy, a zatem tworzone są zależności między kluczami a wartościami. Haszowanie to obszerny temat i nie jest omówiony w tym artykule.
Wniosek
Mapa, znana również jako tablica asocjacyjna, to lista elementów, w której każdy element jest parą klucz/wartość. Tak więc każdy klucz odpowiada wartości. W C++ mapa jest zaimplementowana jako struktura danych z funkcjami i operatorami składowymi. Uporządkowana mapa to taka, w której pary elementów zostały uporządkowane według klawiszy. Mapa nieuporządkowana to taka, w której nie ma porządkowania.
Technicznie hash składa się z pary
Lista inicjująca dla mapy jest literałem tablicowym literałów. Każdy literał wewnętrzny składa się z dwóch obiektów, pary klucz/wartość.
Funkcje i operatory składowe dla unordered_map można podzielić na kategorie pod następującymi nagłówkami: unordered_map construction/copy construction, unordered_map Capacity, unordered_map iterator, unordered_map Operations i unordered_map Modyfikatory.
Nieuporządkowana mapa jest używana, gdy klucz musi być zmapowany na wartość.
Chrys