Jak korzystać z nieuporządkowanej mapy C++

How Use C Unordered Map



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. Różne klucze mogą mieć tę samą wartość, do zwykłej pracy. Na przykład klucze mogą być listą owoców i odpowiadającymi im wartościami, kolorami owoców. W C++ mapa jest zaimplementowana jako struktura danych z funkcjami członkowskimi i operatorami. Uporządkowana mapa to taka, w której pary elementów zostały uporządkowane według kluczy. Mapa nieuporządkowana to taka, w której nie ma porządku. W tym artykule wyjaśniono, jak używać nieuporządkowanej mapy w języku C++, napisanej jako unordered_map. Aby zrozumieć ten artykuł, potrzebujesz wiedzy na temat wskaźników C++. unordered_map jest częścią standardowej biblioteki C++.

Klasa i przedmioty

Klasa to zbiór współpracujących ze sobą zmiennych i funkcji, do których nie przypisano 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; oznacza to, że różne obiekty są tą samą klasą o różnych wartościach. Mówi się, że tworzenie obiektu z klasy jest tworzeniem instancji obiektu.







Imię, unordered_map, to klasa. Obiekt utworzony z klasy unordered_map ma wybraną przez programistę nazwę.



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 utworzone (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:

#włączać
#włączać
używając 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 w 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_map<stały zwęglać*, stały zwęglać*>umap;

umap['banan'] = 'żółty';
umap['winogrono'] = 'Zielony';
umap['Figa'] = 'purpurowy';

Deklaracja zaczyna się od specjalizacji szablonu z typami dla par klucz i wartość. Po nim następuje nazwa mapy wybrana przez programistę; następnie średnik. Drugi segment kodu pokazuje, jak przypisać wartości do ich kluczy.
Budowa przez Initializer_list
Można to zrobić w następujący sposób:

unordered_map<stały zwęglać*, stały zwęglać*>umap({{'banan', 'żółty'},
{'winogrono', 'Zielony'}, {'Figa', 'purpurowy'}});

Budowa przez przypisanie Initializer_list
Przykład:

unordered_map<stały zwęglać*, stały zwęglać*>umap= {{'banan', 'żółty'},
{'winogrono', 'Zielony'}, {'Figa', 'purpurowy'}};

Konstruowanie przez kopiowanie innej unordered_map
Przykład:

unordered_map<stały zwęglać*, stały zwęglać*>umap1({{'banan', 'żółty'},
{'winogrono', 'Zielony'}, {'Figa', 'purpurowy'}});
unordered_map<stały zwęglać*, stały zwęglać*>umap2(umap1);

Para Element

Poniższy kod pokazuje, jak utworzyć i uzyskać dostęp do elementu pair:

para<zwęglać, stały zwęglać*>pr= {'D', 'być'};
koszt<<ks.pierwszy << ' ';
koszt<<ks.druga << ' ';

Dane wyjściowe to:

D
być

pierwszy i drugi są słowami zastrzeżonymi 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:

unordered_map<stały zwęglać*, stały zwęglać*>umap;

umap['banan'] = 'żółty';
umap['winogrono'] = 'Zielony';
umap['Figa'] = 'purpurowy';

stały zwęglać *Prawidłowy=umap['winogrono'];

koszt<<Prawidłowy<<' ';

Wyjście jest: zielone. 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.

unordered_map<stały zwęglać*, stały zwęglać*>umap;

umap['banan'] = 'żółty';
umap['winogrono'] = 'Zielony';
umap['Figa'] = 'purpurowy';

koszt<<umapować.rozmiar() <<' ';

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_map<stały zwęglać*, stały zwęglać*>umap;
koszt<<umapować.pusty() <<' ';

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_map<stały zwęglać*, stały zwęglać*>umap;

umap['banan'] = 'żółty';umap['winogrono'] = 'Zielony';umap['Figa'] = 'purpurowy';

unordered_map<stały zwęglać*, stały zwęglać*> ::iteratoriter=umapować.rozpocząć();
para<stały zwęglać*, stały zwęglać*>pr= *iter;
koszt<<ks.pierwszy << ',' <<ks.druga << ' ';

Dane wyjściowe to: rys, fioletowy. Mapa jest nieuporządkowana.

begin() const noexcept;

Zwraca iterator wskazujący na pierwszy element kolekcji obiektów mapy. Kiedy konstrukcja obiektu jest poprzedzona const, zamiast begin() wykonywane jest wyrażenie begin() const. W tym stanie elementy w obiekcie nie mogą być modyfikowane. Jest używany na przykład w poniższym kodzie.

stałyunordered_map<stały zwęglać*, stały zwęglać*>umap({{'banan', 'żółty'},
{'winogrono', 'Zielony'}, {'Figa', 'purpurowy'}});

unordered_map<stały zwęglać*, stały zwęglać*> ::const_iteratoriter=umapować.rozpocząć();
para<stały zwęglać*, stały zwęglać*>pr= *iter;
koszt<<ks.pierwszy << ',' <<ks.druga << ' ';

Dane wyjściowe to: rys, fioletowy. Mapa jest nieuporządkowana. Zauważ, że tym razem const_iterator został użyty zamiast samego iteratora, 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_map<zwęglać,zwęglać>umap;

umap['do'] = 'b';umap['C'] = 'D';umap['I'] = 'F';

unordered_map<zwęglać,zwęglać> ::iteratoriter=umapować.odnaleźć('C');
Jeśli (umapować.odnaleźć('C') ! =umapować.kończyć się())
{
para<zwęglać,zwęglać>pr= *iter;
koszt<<ks.pierwszy << ',' <<ks.druga << ' ';
}

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

wstaw para(typ_wartości&& obj)
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. Jeśli wstawienie się powiodło, bool będzie 1 dla true, w przeciwnym razie 0 dla false. Jeśli wstawienie się powiedzie, iterator wskaże nowo wstawiony element. Poniższy kod ilustruje użycie:

unordered_map<stały zwęglać*, stały zwęglać*>umap;

umap['banan'] = 'żółty';
umap['winogrono'] = 'Zielony';
umap['Figa'] = 'purpurowy';

umapować.wstawić({{'wiśnia', 'Internet'}, {'truskawka', 'Internet'}});

koszt<<umapować.rozmiar() << ' ';

Dane wyjściowe 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_map<stały zwęglać*, stały zwęglać*>umap;

umap['banan'] = 'żółty';
umap['winogrono'] = 'Zielony';
umap['Figa'] = 'purpurowy';

intna jednego=umapować.usuwać('winogrono');

koszt<<umapować.rozmiar() << ' ';

Wyjście to 2.
nieważna zamiana(unordered_map&)
Dwie nieuporządkowane mapy można zamienić, jak pokazano w tym segmencie kodu:

unordered_map<stały zwęglać*, stały zwęglać*>umap1= {{'banan', 'żółty'},
{'winogrono', 'Zielony'}, {'Figa', 'purpurowy'}, {'truskawka', 'Internet'}};

unordered_map<stały zwęglać*, stały zwęglać*>umap2= {{'wiśnia', 'Internet'}, {'Limonka', 'Zielony'}};

umap1.zamieniać(umap2);

unordered_map<stały zwęglać*, stały zwęglać*> ::iteratoriter1=umap1.rozpocząć();
para<stały zwęglać*, stały zwęglać*>pr1= *iter1;
unordered_map<stały zwęglać*, stały zwęglać*> ::iteratoriter2=umap2.rozpocząć();
para<stały zwęglać*, stały zwęglać*>pr2= *iter2;

koszt<< 'Pierwszy klucz i rozmiar umap1: '<<pr1.pierwszy <<','<<umap1.rozmiar() << ' ';
koszt<< 'Pierwszy klucz i rozmiar umap2'<<pr2.pierwszy <<','<<umap2.rozmiar() << ' ';
unordered_map<stały zwęglać*, stały zwęglać*>umap1= {{'banan', 'żółty'},
{'winogrono', 'Zielony'}, {'Figa', 'purpurowy'}, {'truskawka', 'Internet'}};
unordered_map<stały zwęglać*, stały zwęglać*>umap2= {{'wiśnia', 'Internet'}, {'Limonka', 'Zielony'}};

umap1.zamieniać(umap2);

unordered_map<stały zwęglać*, stały zwęglać*> ::iteratoriter1=umap1.rozpocząć();
para<stały zwęglać*, stały zwęglać*>pr1= *iter1;
unordered_map<stały zwęglać*, stały zwęglać*> ::iteratoriter2=umap2.rozpocząć();
para<stały zwęglać*, stały zwęglać*>pr2= *iter2;

koszt<< 'Pierwszy klucz i rozmiar umap1: '<<pr1.pierwszy <<','<<umap1.rozmiar() << ' ';
koszt<< 'Pierwszy klucz i rozmiar umap2'<<pr2.pierwszy <<','<<umap2.rozmiar() << ' ';

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:

#włączać
#włączać
używając standardowej przestrzeni nazw;

klasa TheCla
{
publiczny:
intna jednego;
statyczny zwęglaćch;

próżniafunkcjonować(zwęglaćnie, stały zwęglać *P)
{
koszt<< 'Są ' <<na jednego<< ' książki warte ' <<nie<<P<< ' w sklepie.' << ' ';
}
statyczny próżniazabawa(zwęglaćch)
{
Jeśli (ch== 'do')
koszt<< „Oficjalna statyczna funkcja składowa” << ' ';
}
};

intGłówny()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<stały zwęglać*,TheCla>umap;
umap= {{'banan',obj1}, {'winogrono',obj2}, {'Figa',obj3}, {'truskawka',obj4}, {'Limonka',obj5}};

koszt<<umapować.rozmiar() << ' ';

powrót 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 lub komunikatu o błędzie.

Zastosowanie mapy

Tablica kojarzy indeks z 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. Może być również parą. W tym drugim przypadku zastosowana zostanie dyrektywa wstępnego przetwarzania. Parą klucz/wartość nadal mogą być imiona par małżeńskich. W krajach, w których panuje poligamia, na jednego mężczyznę przypadną różne żony.

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 członkowskimi i operatorami. Uporządkowana mapa to taka, w której pary elementów zostały uporządkowane według kluczy. Mapa nieuporządkowana to taka, w której nie ma kolejności.

Z technicznego punktu widzenia hash składa się z par elementów. W rzeczywistości para ta jest całą strukturą danych z jej funkcjami członkowskimi i operatorami. Dwa parametry szablonu dla pary są tymi samymi dwoma parametrami szablonu dla unordered_map.

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 członkowskie i operatory 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 Modifiers.

Nieuporządkowana mapa jest używana, gdy klucz musi być zmapowany na wartość.

Chrys