C++

Unikalne i uporządkowane kontenery w C++

Unikalne i uporządkowane kontenery w C++
6, 10, 2, 8, 4 to zestaw; 2, 4, 6, 8, 10 to zbiór tych samych liczb całkowitych, ułożonych w porządku rosnącym. W matematyce zbiór ma unikalne elementy (różne elementy), a to znaczy, że żaden element nie występuje więcej niż raz. Co więcej, multiset to zestaw, w którym dowolny element może wystąpić więcej niż raz. 6, 6, 10, 2, 2, 8, 4, 4, 4 to multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 to ten sam multiset, ale z elementami ułożonymi w porządku rosnącym. Ten artykuł nie dotyczy multiset. Zajmuje się strukturą danych C++ o nazwie set.

Mapa w oprogramowaniu jest jak tablica, ale jest to tablica z dwiema kolumnami zamiast jednej. Pierwsza kolumna zawiera klucze, a druga kolumna wartości. Każdy wiersz to jedna para, co tworzy parę klucz/wartość. Klucz jest bezpośrednio związany z jego wartością.

Przykładem mapy jest 'c',30, 'b',20, 'd',30, 'e',40, 'a',10. Pierwsza para klucz/wartość wstawiona tutaj to 'c',3, gdzie 'c' to klucz, a 30 to wartość. Ta mapa nie jest uporządkowana według kluczy. Porządkowanie tej mapy według kluczy daje 'a',10, 'b',20, 'c',30, 'd',30, 'e',40. Zauważ, że mogą istnieć zduplikowane wartości, ale nie zduplikowane klucze. Mapa uporządkowana to mapa uporządkowana według klawiszy by.

Multiset ma się do zbioru, tak jak multimapa do mapy. Oznacza to, że istnieją mapy ze zduplikowanymi kluczami. Przykładem multimapy jest 'a',10, 'b',20, 'b',20, 'c',30, 'c',30, 'd ',30, 'e',40. Jak wspomniano powyżej, ten artykuł nie dotyczy multimap, ale dotyczy struktury danych C++ zwanej map.

W C++ struktura danych to struktura z właściwościami (członkami danych) i metodami (funkcje członkowskie). Dane struktury to lista; zestaw to lista; mapa to lista par klucz/wartość.

W tym artykule omówiono podstawy zbiorów i map w C++, a aby lepiej zrozumieć ten artykuł, czytelnik powinien mieć podstawową wiedzę o C++.

Treść artykułu:

Klasa i jej obiekty:

W C++ zbiór, mapa i inne podobne struktury nazywane są kontenerami. Klasa jest uogólnioną jednostką zawierającą elementy danych, którymi są zmienne i powiązane ze sobą funkcje składowe. Gdy członkom danych nada się wartości, tworzony jest obiekt. Jednak obiekt powstaje w procesie zwanym instancją. Ponieważ klasa może prowadzić do różnych wartości dla tych samych zmiennych składowych danych, różne obiekty mogą być następnie tworzone z tej samej klasy.

W C++ nieużyteczny zestaw jest klasą, a także nieużyteczną mapą. Kiedy obiekt jest tworzony z nieużytecznego zbioru lub nieużytecznej mapy, obiekt staje się rzeczywistą strukturą danych. W przypadku zbioru i mapowania struktur danych głównym elementem danych jest lista. Otóż ​​zestaw i mapa tworzą grupę kontenerów o nazwie „zamówione kontenery asocjacyjne”. Nieuporządkowany zestaw i nieuporządkowana mapa również istnieją, ale niestety nie zostały one omówione w tym artykule.

Tworzenie zestawu lub mapy:

Tworzenie instancji zestawu z jego klasy set jest tworzeniem zestawu; tworzenie instancji mapy z jej klasy map to tworzenie mapy. Tak utworzony obiekt otrzymuje nazwę wybraną przez programistę.

W celu stworzenia zestawu program należy rozpocząć od:

#zawierać
#zawierać
przy użyciu standardowej przestrzeni nazw;

Zwróć uwagę na dyrektywę „#include ”, która zawiera bibliotekę set zawierającą klasę set, z której zostaną utworzone instancje struktur danych zestawu.

Aby stworzyć mapę, program powinien zacząć od:

#zawierać
#zawierać
przy użyciu standardowej przestrzeni nazw;

Zwróć uwagę na dyrektywę „#include ”, która obejmuje bibliotekę map zawierającą klasę map, z której zostaną utworzone instancje struktur danych map.

Składnia tworzenia pustego zestawu to:

zestaw nazwa obiektu

Przykład:

zestaw zestawObiekt;

Przykładem tworzenia zestawu z zawartością jest:

zestaw setObj(6, 10, 2, 8, 4);

Składnia tworzenia pustej mapy to:

mapa nazwa obiektu

Przykład:

mapa obiekt mapy;

Przykładem tworzenia mapy z treścią jest:

mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);

Podstawy iteratorów:

Iterator to rozbudowany wskaźnik, za pomocą którego można przeszukiwać listę struktury danych od początku do końca.

Funkcja członkowska begin()

Funkcja członkowska begin() zwraca iterator wskazujący na pierwszy element listy. Poniższy przykład ilustruje to dla zestawu:

zestaw setObj(6, 10, 2, 8, 4);
zestaw::iterator iter = setObj.zaczynać();
Cout << *iter << '\n';

Zwróć uwagę na sposób, w jaki begin() został użyty z setObj i operatorem kropki. iter jest zwróconym obiektem iteratora. Zwróć też uwagę na sposób, w jaki został zadeklarowany. * jest operatorem pośrednim. Używany z iterem, zwraca pierwszy element zestawu; pierwszy element to 2 zamiast 6 - patrz wyjaśnienie poniżej.

Poniższy przykład ilustruje użycie funkcji begin() dla mapy:

mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
mapa::iterator iter = mapObj.zaczynać();
Cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Zwróć uwagę na sposób, w jaki begin() został użyty z mapObj i operatorem kropki. iter jest zwróconym obiektem iteratora. Zwróć też uwagę na sposób, w jaki został zadeklarowany. Użyty tutaj termin „pierwszy” odnosi się do klawisza. „drugi” odnosi się do wartości odpowiadającej kluczowi. Obserwuj, jak zostały użyte z iter, aby uzyskać początkowe elementy składowe listy. Pierwszym elementem jest a,10 zamiast c,30 - patrz wyjaśnienie poniżej.

Składnik „begin() const” Function

Funkcja składowa „begin() const” zwraca iterator, który wskazuje na pierwszy element listy, gdy deklaracja zestawu zaczyna się od const (dla stałej). W tym stanie wartość na liście, do której odwołuje się zwracany iterator, nie może zostać zmieniona przez iterator. Poniższy przykład ilustruje jego zastosowanie w zestawie:

zestaw stały setObj(6, 10, 2, 8, 4);
zestaw::const_iterator iter = setObj.zaczynać();
Cout << *iter << '\n';

Zwróć uwagę na sposób, w jaki begin() został użyty z setObj i operatorem kropki. Nie wpisano „const” zaraz po begin(). Jednak „const” poprzedziła deklarację. iter tutaj jest zwracanym stałym obiektem iteratora, który różni się od zwykłego iteratora. Zwróć też uwagę na sposób, w jaki został zadeklarowany. * jest operatorem pośrednim; używany z iter, zwraca pierwszy element zbioru. Pierwszym elementem jest 2 zamiast 6 - patrz wyjaśnienie poniżej.

Poniższy przykład ilustruje użycie funkcji „begin() const” dla mapy:

stała mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
mapa::const_iterator iter = obiekt mapy.zaczynać();
Cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Zwróć uwagę na sposób, w jaki begin() został użyty z mapObj i operatorem kropki. Nie wpisano „const” zaraz po begin(). Jednak deklarację poprzedził „const”. iter tutaj jest zwracanym stałym obiektem iteratora, który różni się od zwykłego iteratora. Zwróć też uwagę na sposób, w jaki został zadeklarowany. „pierwszy”, użyty tutaj, odnosi się do klucza; „drugi”, użyty tutaj, odnosi się do wartości odpowiadającej kluczowi. Obserwuj, jak zostały użyte z iter, aby uzyskać początkowe elementy składowe listy. Pierwszym elementem jest a,10 zamiast c,30 - patrz wyjaśnienie poniżej.

Funkcja członka end()

Funkcja członkowska end() zwraca iterator wskazujący tuż za końcem listy. Poniższy przykład ilustruje to dla zestawu:

zestaw setObj(6, 10, 2, 8, 4);
zestaw::iterator iter = setObj.koniec();
Cout << *iter << '\n';

Zwróć uwagę na sposób, w jaki end() został użyty z setObj i operatorem kropki. iter jest zwróconym obiektem iteratora. Zwróć też uwagę na sposób, w jaki został zadeklarowany. * jest operatorem pośrednim; jak używany z iter, zwraca ostatni +1 element zbioru. Na komputerze autora ten ostatni +1 element to 5, którego nie ma na liście. Uważaj więc, aby nie używać tego elementu.

Poniższy przykład ilustruje użycie funkcji end() dla mapy:

mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
mapa::iterator iter = mapObj.koniec();
Cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Zwróć uwagę na sposób użycia end() z mapObj i operatorem kropki. iter jest zwróconym obiektem iteratora. Zwróć też uwagę na sposób, w jaki został zadeklarowany. * jest operatorem pośrednim; jak używany z iter, zwraca ostatni +1 element mapy. W komputerze autora ten ostatni +1 element to ,0, którego nie ma na liście. Uważaj więc, aby nie używać tego elementu.

Składnik „end() const” Funkcja

Funkcja składowa „end() const” zwraca iterator, który wskazuje tuż za końcem listy, gdy deklaracja zestawu zaczyna się od const (dla stałej). W tym stanie wartość na liście, do której odwołuje się zwracany iterator, nie może zostać zmieniona przez iterator. Poniższy przykład ilustruje jego zastosowanie w zestawie:

zestaw stały setObj(6, 10, 2, 8, 4);
zestaw::const_iterator iter = setObj.koniec();
Cout << *iter << '\n';

Zwróć uwagę na sposób użycia end() z setObj i operatorem kropki. Nie wpisano „const” tuż po end(). Jednak „const” poprzedziła deklarację. iter jest zwróconym obiektem iteratora. Zwróć też uwagę na sposób, w jaki został zadeklarowany. * jest operatorem pośrednim; jak używany z iter, zwraca ostatni +1 element zbioru.

Poniższy przykład ilustruje użycie funkcji „end() const” dla mapy:

stała mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
mapa::const_iterator iter = mapaObj.koniec();
Cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Zwróć uwagę na sposób użycia end() z mapObj i operatorem kropki. Nie wpisano „const” tuż po end(). Jednak „const” poprzedziła deklarację. iter jest zwracanym stałym obiektem iteratora, który różni się od zwykłego iteratora. Ponadto uważnie obserwuj sposób, w jaki zostało to ogłoszone.

Dostęp do elementów zestawu i mapy:

Zestaw

Z zestawem element jest odczytywany za pomocą operatora pośredniego. Pierwsze dwa elementy zestawu są odczytywane w następującym przykładzie:

zestaw setObj(6, 10, 2, 8, 4);
zestaw::iterator iter = setObj.zaczynać();
Cout << *iter << '\n';
++iter;
Cout << *iter << '\n';

Wyjście to 2, a następnie 4 - patrz wyjaśnienie poniżej. Aby wskazać kolejny element listy, iterator jest inkrementowany.

Uwaga: Elementu nie można zmienić za pomocą operatora pośredniego dla zbioru. Na przykład „*iter = 9;” nie jest możliwe.

mapa

Mapa składa się z par klucz/wartość. Wartość można odczytać za pomocą odpowiedniego klawisza i zmienić za pomocą tego samego klawisza. Poniższy segment kodu ilustruje to:

mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
Cout << mapObj['b'] << '\n';
obiekt mapy['b'] = 55;
Cout << mapObj['b'] << '\n';

Dane wyjściowe to:

20
55

Operator kropki nie został tutaj użyty. Zamiast tego użyto operatora nawiasów kwadratowych, który przyjmuje klucz jako zawartość.

Kolejność elementów w zestawie lub mapie:

Elementy można łączyć w zestaw w dowolnej kolejności. Jednak po włożeniu zestaw przestawia swoje elementy w kolejności rosnącej. Rosnąca kolejność jest domyślną kolejnością. Jeśli potrzebna jest kolejność malejąca, to zestaw należy zadeklarować jak w poniższym przykładzie:

zestaw > setObj(6, 10, 2, 8, 4);

Więc po typie e.sol., int, dla szablonu znajduje się przecinek, po którym następuje „większe”w nawiasach kątowych.

Elementy można wstawiać do mapy w dowolnej kolejności. Jednak po wstawieniu mapa zmienia swoje elementy w kolejności rosnącej według klucza (tylko), zachowując związek między każdym kluczem a jego wartością. Kolejność rosnąca jest kolejnością domyślną; jeśli potrzebna jest kolejność malejąca, mapę należy zadeklarować jak w poniższym przykładzie:

mapa > mapObj('c',30,'b',20,'d',30,'e',40,'a',10);

Tak więc po parze typów e.sol., „char, int”, w szablonie znajduje się przecinek, po którym następuje „większe”w nawiasach kątowych.

Przemierzanie zestawu

Pętla while lub pętla for z iteratorem mogą być używane do przechodzenia przez zestaw. Poniższy przykład wykorzystuje pętlę for do przechodzenia przez zestaw, który został skonfigurowany w kolejności malejącej:

zestaw > setObj(6, 10, 2, 8, 4);
dla (zestaw::iterator iter = setObj.zaczynać(); iter != setObj.koniec(); ++iter)

Cout << *iter << ";

Dane wyjściowe to:

10 8 6 4 2

Inkrementacja iteratora wskazuje go na następny element.

Przemierzanie mapy

Pętla while lub pętla for z iteratorem mogą być używane do przemierzania mapy. Poniższy przykład wykorzystuje pętlę for do przemierzania mapy, która została skonfigurowana w kolejności malejącej:

mapa > mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
dla (mapa::iterator iter = mapObj.zaczynać(); iter != mapObj.koniec(); ++iter)

Cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Dane wyjściowe to:

e, 40, d, 30, c, 30, b, 20, a, 10,

Inkrementacja iteratora wskazuje go na następny element. „pierwszy” w kodzie odnosi się do klucza, a „drugi” odnosi się do odpowiedniej wartości. Zwróć uwagę, jak te wartości zostały uzyskane dla wyjścia.

Inne często używane funkcje składowe:

Funkcja size()

Ta funkcja zwraca liczbę całkowitą, która jest liczbą elementów na liście. Ustaw przykład:

zestaw > setObj(6, 10, 2, 8, 4);
Cout << setObj.size() << '\n';

Wyjście to 5.

Przykład mapy:

mapa > mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
Cout << mapObj.size() << '\n';

Wyjście to 5.

Funkcja insert()

zestaw

zestaw nie pozwala na duplikat. Tak więc każdy wstawiony duplikat jest po cichu odrzucany. W przypadku zestawu argumentem funkcji insert() jest wartość do wstawienia. Wartość jest dopasowana do pozycji, w której kolejność w zestawie pozostaje rosnąca lub malejąca. Przykład:

zestaw setObj(6, 10, 2, 8, 4);
setObj.wstaw (6);
setObj.wstawka(9);
setObj.wstawka(12);
dla (zestaw::iterator iter = setObj.zaczynać(); iter != setObj.koniec(); ++iter)

Cout << *iter << ";

Dane wyjściowe to:

2 4 6 8 9 10 12

Uwaga: Funkcja członkowska insert() może być użyta do wypełnienia pustego zestawu.

mapa

mapa nie pozwala na duplikowanie według klucza. Tak więc każdy wstawiony duplikat jest po cichu odrzucany. W przypadku mapy argumentem funkcji insert() jest para klucz/wartość w nawiasach klamrowych. Element jest dopasowywany do pozycji za pomocą klucza, w której kolejność na mapie pozostaje rosnąca lub malejąca. Przykład:

mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
mapObj.wstaw('e',80);
mapObj.wstaw('f',50);
mapObj.wstaw('g',60);
dla (mapa::iterator iter = mapObj.zaczynać(); iter != mapObj.koniec(); ++iter)
Cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Dane wyjściowe to:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

Uwaga: Funkcja członkowska insert() może być użyta do wypełnienia pustej mapy.

Funkcja empty()

Ta funkcja zwraca prawdę, jeśli lista jest pusta, i fałsz, jeśli jest inaczej. Ustaw przykład:

zestaw setObj(6, 10, 2, 8, 4);
bool ret = setObj.pusty();
Cout << ret << '\n';

Wyjście to 0 dla fałszu, co oznacza, że ​​zestaw tutaj nie jest pusty.

Przykład mapy:

mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
bool ret = mapObj.pusty();
Cout << ret << '\n';

Wyjście to 0 dla fałszu, co oznacza, że ​​mapa tutaj nie jest pusta.

Funkcja kasowania ()

zestaw

Rozważ następujący segment kodu:

zestaw setObj(10, 20, 30, 40, 50);
zestaw::iterator iter = setObj.zaczynać();
zestaw::iterator itr = setObj.wymazać(iter);
Cout << "new size: " << setObj.size() << '\n';
Cout << "next value: " << *itr << '\n';
itr = setObj.wymazać(itr);
Cout << "new size: " << setObj.size() << '\n';
Cout << "next value: " << *itr << '\n';

Dane wyjściowe to:

nowy rozmiar: 4
kolejna wartość: 20
nowy rozmiar: 3
następna wartość: 30

Funkcja erase() przyjmuje iterator wskazujący element jako argument. Po skasowaniu elementu funkcja erase() zwraca iterator wskazujący na następny element.

mapa

Rozważ następujący segment kodu:

mapa mapObj('a',10,'b',20,'c',30,'d',40,'e',50);
mapa::iterator iter = mapObj.zaczynać();
mapa::iterator itr = mapObj.wymazać(iter);
Cout << "new size: " << mapObj.size() << '\n';
Cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = obiekt mapy.wymazać(itr);
Cout << "new size: " << mapObj.size() << '\n';
Cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Dane wyjściowe to:

nowy rozmiar: 4
następna para wartości: b,20
nowy rozmiar: 3
następna para wartości: c,30

Funkcja erase() przyjmuje iterator wskazujący element jako argument. Po skasowaniu elementu funkcja erase() zwraca iterator wskazujący na następny element.

Funkcja clear ()

Funkcja clear() usuwa wszystkie elementy z listy. Ustaw przykład:

zestaw setObj(6, 10, 2, 8, 4);
setObj.jasny();
Cout << setObj.size() << '\n';

Wyjście to 0.

przykład mapy:

mapa mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
mapObj.jasny();
Cout << mapObj.size() << '\n';

Wyjście to 0.

Wniosek:

Struktura zestawu danych w C++ to struktura, w której lista elementów jest przechowywana domyślnie w kolejności rosnącej lub w kolejności malejącej według wyboru programisty. Wszystkie elementy zestawu są niepowtarzalne. Struktura danych mapy w C++ to struktura, w której lista jest haszem par klucz/wartość, domyślnie przechowywanych w rosnącej kolejności kluczy lub w malejącej kolejności kluczy według wyboru programisty. Klucze są również unikalne i mogą występować zduplikowane wartości. Głównym elementem danych każdej ze struktur jest lista. Każda ze struktur ma funkcje składowe, z których niektóre są powszechnie używane.

Gry Open Source Ports of Commercial Game Engines
Open Source Ports of Commercial Game Engines
Free, open source and cross-platform game engine recreations can be used to play old as well as some of the fairly recent game titles. This article wi...
Gry Najlepsze gry wiersza poleceń dla systemu Linux
Najlepsze gry wiersza poleceń dla systemu Linux
Wiersz poleceń jest nie tylko twoim największym sprzymierzeńcem podczas korzystania z Linuksa - może być również źródłem rozrywki, ponieważ możesz go ...
Gry Najlepsze aplikacje do mapowania gamepada dla systemu Linux
Najlepsze aplikacje do mapowania gamepada dla systemu Linux
Jeśli lubisz grać w gry na Linuksie za pomocą gamepada zamiast typowego systemu wprowadzania klawiatury i myszy, jest kilka przydatnych aplikacji dla ...