C++

Jak korzystać z nieuporządkowanej mapy C++++

Jak korzystać z nieuporządkowanej mapy C++++
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 klawisze mogą być listą owoców i odpowiadającymi im wartościami, kolorami owoców. 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ądku. Ten artykuł wyjaśnia, jak używać nieuporządkowanej mapy w 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, 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_map umapować;
umap["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:

unordered_map umap ("banan", "żółty",
"winogron", "zielony", "fig", "fioletowy");

Konstruowanie przez przypisanie Initializer_list
Przykład:

unordered_map umap = "banan", "żółty",
"winogron", "zielony", "fig", "fioletowy";

Konstruowanie przez kopiowanie innej unordered_map
Przykład:

unordered_map umap1 ("banan", "żółty",
"winogron", "zielony", "fig", "fioletowy");
unordered_map umap2 (umap1);

Para Element

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

para pr = 'd', "morze";
Cout << pr.first << '\n';
Cout << pr.second << '\n';

Dane wyjściowe to:

re
morze

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:

unordered_map umapować;
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.

unordered_map umapować;
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_map umapować;
Cout << 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_map umapować;
umap["banan"] = "żółty"; umap["winogrona"] = "zielony"; umap["fig"] = "fioletowy";
unordered_map::iterator iter = umap.zaczynać();
para pr = *iter;
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 umap ("banan", "żółty",
"winogron", "zielony", "fig", "fioletowy");
unordered_map::const_iterator iter = umap.zaczynać();
para pr = *iter;
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_map umapować;
umap['a'] = 'b'; umap['c'] = 'd'; umap['e'] = 'f';
unordered_map::iterator iter = umap.znajdź('c');
jeśli (umap.znajdź('c') != umap.koniec())

para pr = *iter;
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 wstaw(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 równe 1 dla prawdy, w przeciwnym razie będzie to 0 dla fałszu. Jeśli wstawienie się powiedzie, iterator wskaże nowo wstawiony element. Poniższy kod ilustruje użycie:

unordered_map umapować;
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_map umapować;
umap["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:

unordered_map umap1 = "banan", "żółty",
"winogron", "zielony", "fig", "fioletowy", "truskawka", "czerwony";
unordered_map umap2 = "wiśnia", "czerwony", "limonkowy", "zielony";
umap1.swap(umap2);
unordered_map::iterator iter1 = umap1.zaczynać();
para pr1 = *iter1;
unordered_map::iterator iter2 = umap2.zaczynać();
para pr2 = *iter2;
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 umap1 = "banan", "żółty",
"winogron", "zielony", "fig", "fioletowy", "truskawka", "czerwony";
unordered_map umap2 = "wiśnia", "czerwony", "limonkowy", "zielony";
umap1.swap(umap2);
unordered_map::iterator iter1 = umap1.zaczynać();
para pr1 = *iter1;
unordered_map::iterator iter2 = umap2.zaczynać();
para pr2 = *iter2;
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 umapować;
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. Może być również parą. W tym drugim przypadku zostanie zastosowana 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ę będą miały 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 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 elementy. W rzeczywistości para 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 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

Gry Jak używać AutoKey do automatyzacji gier Linux
Jak używać AutoKey do automatyzacji gier Linux
AutoKey to narzędzie do automatyzacji pulpitu dla systemów Linux i X11, zaprogramowane w Python 3, GTK i Qt. Korzystając ze skryptów i funkcji MAKRO, ...
Gry How to Show FPS Counter in Linux Games
How to Show FPS Counter in Linux Games
Linux gaming got a major push when Valve announced Linux support for Steam client and their games in 2012. Since then, many AAA and indie games have m...
Gry How to download and Play Sid Meier's Civilization VI on Linux
How to download and Play Sid Meier's Civilization VI on Linux
Introduction to the game Civilization 6 is a modern take on the classic concept introduced in the series of the Age of Empires games. The idea was fai...