Jak używać map w C ++

Jak używać map w C ++
Mapa C ++ to struktura danych z listy z parami/wartościami wartości. Struktura danych ma funkcje członka. W C ++ znajduje się mapa, a nieorząd. Mapa to właściwie uporządkowana mapa. Zamówienie mapy może być wznoszące się lub schodzące według kluczy. Domyślnie jest kolejność rosnąca według klawiszy. Funkcje uporządkowanej mapy i nieopisanej mapy są tak wiele w zakresie, w jakim tylko te dla mapy (i.mi., uporządkowana mapa) zostanie rozpatrzona w tym artykule.

Funkcje mapy można podzielić na konstrukcję, dostęp do elementów, pojemność, iteratory, modyfikatory, obserwatorów, operacje i wyspecjalizowane algorytmy. Zdarza się również, że funkcje map są wiele. Tak więc tylko podstawowe funkcje w tych kategoriach zostaną wyjaśnione.

Przykładem listy par kluczy/wartości jest następująca lista owoców i ich dojrzałej skóry wspólne kolory:

BlackBerry => ciemnoniebieski czarny
mango => żółty
Passion owoce => fioletowe
śliwka => fiolet
banan => żółty

Struny po lewej stronie listy tworzą klucze; te po właściwej tworzą wartości. Pary klucza/wartości niekoniecznie muszą być z ciągów/ciągu. Może być z int/string, string/float, int/float itp. Na mapie C ++ para klucza/wartości jest elementem, a takie elementy tworzą listę struktury danych. Struktura danych mapy zapewnia szybkie pobieranie danych opartych na klawiszach. Klucze są wyjątkowe, a struktura mapa jest wiele do jednego. Oznacza to, że wartości mogą mieć duplikaty, ale klucze nie mogą.

Aby użyć biblioteki map w programie C ++, program powinien zacząć od czegoś takiego:

#włączać
#włączać
za pomocą przestrzeni nazw Std;

Jeśli ciągi są częścią mapy, użycie #Include zamiast tego będzie wskazane. W tym artykule wyjaśniono, jak użyć mapy C ++.

Treść artykułu

  • Budowa/zniszczenie
  • Konstruowanie i dopasowanie par
  • Wyświetlanie (drukowanie) treści mapy
  • Dostęp do elementu
  • Pojemność
  • Iteratorzy
  • Modyfikatory
  • Zamawianie rosnące lub malejące
  • Operacje
  • Specjalistyczne algorytmy
  • Wniosek

Budowa/zniszczenie

Mapa jest kontenerem asocjacyjnym, który należy skonstruować z klasy mapy.

mapa (inicitizer_list, const compare & = compare (), const alokator & = alokator ())

Poniższa instrukcja konstruuje mapę dla powyższej listy przez inicjalizację:

mapa MP „BlackBerry”, „ciemnoniebieski”, „mango”, „żółty”, „Passion Fruit”, „fiolet”, „śliwki”, „fioletowe”, „banan” , "żółty";

Zwróć uwagę, jak każda para została wyznaczona.

A = IL

Poniższa konstrukcja inicjalizacji korzysta z operatora przypisania:

mapa mp = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion Fruit”, „fiolet”, „śliczka”, „fioletowa”, „banan ", "żółty";

Pustą mapę można utworzyć za pomocą wyrażenia po lewej stronie, a następnie dodane elementy - patrz poniżej.

Zniszczenie
Aby zniszczyć mapę, po prostu pozwól jej wyjść z zakresu.

Konstruowanie i dopasowanie par

Dla powyższej mapy para składa się z klawisza łańcuchowego i wartości ciągu. Element pary można konstruować niezależnie od mapy. Poniższy segment kodu tworzy obiekt pustej pary z klasy par, a następnie przypisuje jeden klucz i jedną wartość:

para pr;
Pr.First = "BlackBerry";
Pr.second = "ciemnoniebieski czarny";

Nazwa właściwości kluczowej jest pierwsza, a nazwa właściwości wartości jest po drugie. Poniższy kod tworzy pustą mapę i wkłada dwie pary za pomocą funkcji członka Map Insert.

Map MP;
para PR0;
Pr0.First = "BlackBerry";
Pr0.second = "ciemnoniebieski czarny";
para PR1;
PR1.First = „Mango”;
PR1.second = „żółty”;
poseł.wstaw (PR0);
poseł.wstaw (PR1);

Wyświetlanie (drukowanie) treści mapy

Poniższy kod wykorzystuje iterator (IT), opracowany z pierwszego elementu mapy, aby wyświetlić pary klucza/wartości w konsoli:

Map Mp = „śliwki”, „fioletowy”, „mango”, „żółty”, „BlackBerry”, „ciemnoniebiesko-czarny”, „Passion Fruit”, „fiolet”, " banan ",„ żółty ”;
for (map :: iterator it = mp.zaczynać(); To!= MP.koniec(); ++ it)
Cout BlackBerry => ciemnoniebieski czarny
mango => żółty
Passion owoce => fioletowe
śliwka => fiolet

=> nie ma tutaj znaczenia C ++. Służy po prostu do oddzielenia klawisza od odpowiedniej wartości na wyświetlaczu. Aby uzyskać wartość właściwości wskaźnika (iterator), użyj -> między wskaźnikiem (iterator) a nazwą właściwości. Tak więc -> ma znaczenie w C++.

Zauważ, że lista została wyświetlona w kolejności rosnącej klawiszy, chociaż elementy nie zostały zakodowane.

Do pary kluczy/wartości można nadal uzyskać dostęp za pomocą schematu Element na listy. Poniższy segment kodu to ilustruje:

Map Mp = „śliwki”, „fioletowy”, „mango”, „żółty”, „BlackBerry”, „ciemnoniebiesko-czarny”, „Passion Fruit”, „fiolet”, " banan ",„ żółty ”;
dla (para Elem: MP)
Cout << elem.first < " << elem.second < yellow
BlackBerry => ciemnoniebieski czarny
mango => żółty
Passion owoce => fioletowe
śliwka => fiolet

Jak przedtem. Zauważ, że ELEM tutaj jest nazwą obiektu, a nie wskaźnik (ani iterator). Następnie następuje kropka, a nie -> w celu uzyskania dostępu do nieruchomości.

Dostęp do elementu

T & operator [] (key_type && x)

Element nie na mapie można uwzględnić za pomocą jego klucza za pośrednictwem operatora []. Wartość elementu, który jest już na mapie, można odczytać za pomocą operatora [] za pomocą jego klucza. Poniższy program ilustruje je:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

Map MP;
MP [„śliwki”] = „fiolet”;
MP [„Passion Fruit”] = „Purple”;
MP [„BlackBerry”] = „Dark Blue-Black”;
Cout<Cout<Cout<powrót 0;

Wyjście to:

fioletowy
fioletowy
ciemnoniebieski
const t & at (const key_type i x) const

Jeśli mapa jest zadeklarowana stała, wówczas wartości klawiszy nie można zmienić. Jednak tę funkcję elementu można użyć do odczytu wartości klawiszy. Poniższy kod to ilustruje:

const map mp „pllum”, „fioletowy”, „mango”, „żółty”, „BlackBerry”, „ciemnoniebieski”;
Cout<Cout<Cout<

Wyjście to:

fioletowy
żółty
ciemnoniebieski

Pojemność

size_type size () const noexcept

Długość mapy można określić za pomocą funkcji elementu size (), jak pokazuje następujący kod:

const map mp „pllum”, „fioletowy”, „mango”, „żółty”, „BlackBerry”, „ciemnoniebieski”;
Cout<

Wyjście to 3.

[[GOINGISCARD]] bool pusty () const noxcept

Ta funkcja członka zwraca true, jeśli mapa jest pusta, a w przeciwnym razie fałsz. Przykład:

const Map MP;
Cout<

Wyjście to 1 dla prawdziwego. Byłoby to 0 dla fałszu (w przeciwnym razie).

Iteratorzy

iterator początek () no -except

To zwraca dwukierunkowy iterator wskazujący na pierwszy element mapy. Wartość elementu (pary) wskazuje, można zmienić. Przykładowy kod:

Map Mp „śliwki”, „fioletowy”, „mango”, „żółty”, „BlackBerry”, „ciemnoniebieski”;
Map :: Iterator It;
dla (it = mp.zaczynać(); To!= MP.koniec(); it ++)
Cout
Coutfor (map :: iterator it = mp.zaczynać(); To!= MP.koniec(); it ++)
Cout mango => żółty
śliwka => fiolet
BlackBerry => ciemnoniebieski czarny
mango => biały
śliwka => fiolet

Wartość dla drugiej pary klucza/wartości została zmieniona. Zwróć uwagę na użycie iteratora końca ().

reverse_iterator rbegin () no -except

Zwraca to dwukierunkowy iterator odwrotny, wskazujący na ostatni element mapy. Wartość elementu, na który wskazuje, można zmienić. Poniższy kod daje ten sam wynik, co powyższe:

Map Mp „śliwki”, „fioletowy”, „mango”, „żółty”, „BlackBerry”, „ciemnoniebieski”;
map :: reverse_iterator IT;
dla (it = mp.rbegin (); To!= MP.rozdzierać(); it ++)
Cout
Coutfor (map :: reverse_iterator it = mp.rbegin (); To!= MP.rozdzierać(); it ++)
Cout mango => żółty
BlackBerry => ciemnoniebieski czarny
śliwka => fiolet
mango => biały
BlackBerry => ciemnoniebieski czarny

Ta sama wartość dla drugiej pary klucza/wartości została zmieniona.

Modyfikatory

Z mapą, ponieważ zawsze będzie ono ułożone (uporządkowane) przez klucze, po wstawieniu, nie ma znaczenia, czy wstawienie jest ukierunkowane przez programistę na początku, wewnątrz, czy na końcu mapy. Zakaz wstępu według klawiszy jest wynikiem domyślnym.

Modyfikowanie mapy dotyczy wkładania, wdrażania, wyodrębnienia, usuwania i usuwania. Wstawienie i umieszczanie jest podobne, ale umieszczanie jest lepsze.

Emplace

para A_uniq.emplace (args)

Ta funkcja członka wprowadza literały pary klucza/wartości, oddzielone przecinkiem, bez kręconych nawiasów, jak pokazano w następującym kodzie:

map Mp = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion Fruit”, „fiolet”;
para pr = mp.emplace („banan”, „żółty”);
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout<Cout BlackBerry => ciemnoniebieski czarny
mango => żółty
Passion owoce => fioletowe
banan => 1

Funkcja członka EMPlace (Args) zwraca parę odpowiadającą wstawionemu elementowi. Kluczem tej pary powrotnej jest iterator wskazujący na włożony element. Wartość tej pary powrotnej jest prawdziwa (1), jeśli nastąpiło wstawienie i fałsz (0), jeśli wstawianie nie nastąpiło.

Zwróć uwagę na sposób, w jaki typ powrotu dla emplace (args) został zakodowany. Ponadto para powrotu nie została użyta do uzyskania klucza/wartości wstawionej pary map w ostatniej instrukcji wyjściowej. Istnieją tutaj dwa rodzaje par: para mapy i para powrotu. Nie są kompatybilne. Jeśli klucz istniał już na mapie, zwrócony iterator wskazywałby na istnienie klucza; Wtedy wartość logiczna byłaby fałszywa.

Wkładanie

para wstaw (value_type && x)

Ta funkcja członka wprowadza literały pary klucza/wartości, oddzielone przecinkiem, z kręconymi nawiasami, jak pokazano w następującym kodzie:

map Mp = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion Fruit”, „fiolet”;
para pr = mp.insert („banana”, „żółty”);
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout<Cout BlackBerry => ciemnoniebieski czarny
mango => żółty
Passion owoce => fioletowe
banan => 1

Wyjaśnienie jest podobne w powyższym przypadku dla emplace (args).

para wstaw (const value_type i x)

Identyfikator pary może być używany jako argument funkcji insert (). Ilustracja:

map Mp = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion Fruit”, „fiolet”;
para pr;
Pr.First = „banana”;
Pr.second = „żółty”;
para ib = mp.wstaw (PR);
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout<Cout BlackBerry => ciemnoniebieski czarny
mango => żółty
Passion owoce => fioletowe
banan => 1

Wyjaśnienie jest podobne do powyższej sprawy.

void insert (inicitizer_list)

Można włożyć całą listę. Natychmiast po wstawieniu istnieje przegrupowanie (w kolejności rosnącej). Ilustracja:

map Mp = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion Fruit”, „fiolet”;
poseł.insert („Watermelon”, „zielony”, „winogrona”, „Pink”, „apricot”, „Orange”);
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second < orange
BlackBerry => ciemnoniebieski czarny
winogron => różowy
mango => żółty
Passion owoce => fioletowe
Watermelon => zielony

Uwaga: na mapie nie powinien już istnieć żaden klucz listy.

void insert (pierwszy inputiterator, inputiterator ostatni)

Można włożyć zakres, [i, j) z innej mapy. Tutaj ja i J to iteratory. Ilustracja:

Map mp1 = „winogron”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”, „Peach”, „ciemny żółty”, „Papaya”, "Pomarańczowy";
map :: iterator ITB = mp1.zaczynać();
ITB ++;
map :: iterator Ite = mp1.koniec();
Ite--; Ite--;
map MP2 = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion owoc”, „fioletowy”;
MP2.wstaw (ITB, ITE);
dla (Auto Elem: MP2)
Cout << elem.first < " << elem.second < dark blue-black
winogron => różowy
mango => żółty
papaya => pomarańczowy
Passion owoce => fioletowe

Zauważ, że element odpowiadający J z pierwszej mapy nie został wstawiony. Jest to zgodne z zapisem, [i, j).

Wymazanie

Size_type Erase (const key_type i x)

Usuwa element zidentyfikowany przez klucz i zwraca liczbę wymazanych elementów (powinien wynosić 1 w przypadku nie-multimap). Ilustracja:

map Mp = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion Fruit”, „fiolet”;
int n = mp.usunąć („mango”);
Cout<dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout <Cout<Passion owoce => fioletowe
2

Wymazany element jest usuwany, o ile użytkownika. Więc liczba elementów jest zmniejszona.

Iterator Erase (pozycja Const_iterator)

Wymazanie można wykonać za pomocą iteratora. Zwraca iterator wskazujący na element po wymazaniu. Ilustracja:

map Mp = „BlackBerry”, „ciemnoniebieski-czarny”, „mango”, „żółty”, „Passion Fruit”, „fiolet”;
map :: iterator it = mp.zaczynać();
it ++;
map :: iterator iter = mp.usunąć (it);
Cout dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout <Cout<BlackBerry => ciemnoniebieski czarny
Passion owoce => fioletowe
2

Iterator Erase (Const_iterator pierwszy, Const_iterator Last)

To wykorzystuje iteratory do usuwania zakresu od uporządkowanej mapy. Zwraca iterator wskazujący na element po usuniętym zakresie. Ilustracja:

Map Mp = „Grape”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”, „Peach”, „ciemny żółty”, „papaya”, "Pomarańczowy";
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout <map :: iterator ITB = mp.zaczynać();
ITB ++;
map :: iterator Ite = mp.koniec();
Ite--; Ite--;
map :: iterator iter = mp.usunąć (ITB, ITE);
Cout dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout <Cout<winogron => różowy
papaya => pomarańczowy
Peach => ciemnożółty
Strawberry => czerwony
Peach => ciemnożółty
Apricot => Orange
Peach => ciemnożółty
Strawberry => czerwony
3

Zamawianie oryginalnej zawartości mapy jest po raz pierwszy wyświetlane na wyjściu, dzięki. Zauważ, że element wskazany przez drugi iterator argumentu nie jest wymazany.

Jasne

void clear () no -on -except

Usuwa wszystkie elementy mapy, tworząc rozmiar mapy, zero. Przykład:

map mp = „winogron”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”;
poseł.jasne();
Cout<

Wyjście to 0.

Ekstrakcja
Dotyczy to node_type - patrz później.

Łączenie
Po scalaniu dwóch map elementy mieszają się w kolejności (rosnące); Żadna para klucza/wartości nie jest oddzielona.

void a.Scal (A2)

Element w A2 z tym samym kluczem w a. Dotyczy to node_type - patrz później.

Zamawianie rosnące lub malejące

Domyślnie mapa wznosi się przez klucze tuż po stworzeniu. Można to zstopić. W nawiasach kąta szablonu trzeci parametr ma domyślny typ, mniej. I tak nie trzeba wpisywać. Aby mapa opadła według klucza, należy użyć większego, jak w następującym kodzie:

mapa mp = „winogron”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”;
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second < red
winogron => różowy
Apricot => Orange

Gdy tylko mapa zostanie utworzona, jest ona uporządkowana wznosząca się lub schodzeniem (domyślnie rosnąca). mniej lub więcej jest znany jako obiekt porównywania.

Operacje

Iterator Find (const key_type i x)

Zwraca iterator elementu, którego klucz jest argumentem do znalezienia (). Ilustracja:

mapa mp = „winogron”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”;
map :: iterator it = mp.znaleźć („winogron”);
Cout
iterator dolne_bound (const key_type i x)

Na mapie elementy są ułożone według klucza, w kolejności rosnącej, domyślnie. Jeśli programista chce poznać iterator, który wskazuje element, który nie jest niższy niż w konkretnym kluczu, musi użyć tej funkcji członka. Ilustracja:

Map Mp = „Grape”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”, „Peach”, „ciemny żółty”, „papaya”, "Pomarańczowy";
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout <map :: iterator it = mp.dolne_bound („papaya”);
Cout winogron => różowy
papaya => pomarańczowy
Peach => ciemnożółty
Strawberry => czerwony
papaya => pomarańczowy

W tej sytuacji iterator wskazuje na kluczowy element. Jeśli klucz nie zostanie znaleziony, funkcja zwróci iterator, który wskazuje tuż po zakończeniu mapy. W tej sytuacji jest cykliczny i byłby to pierwszy element mapy.

Iterator Upper_Bound (const key_type i x)

Jeśli programista chce poznać iterator, który wskazuje na element z kluczem większym niż K, musi użyć tej funkcji członka. Ilustracja:

Map Mp = „Grape”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”, „Peach”, „ciemny żółty”, „papaya”, "Pomarańczowy";
dla (Auto Elem: MP)
Cout << elem.first < " << elem.second << endl;
Cout <map :: iterator it = mp.Upper_Bound („papaya”);
Cout winogron => różowy
papaya => pomarańczowy
Peach => ciemnożółty
Strawberry => czerwony
Peach => ciemnożółty

Iterator wskazujący na element tuż po zwróceniu elementu kluczy. Jeśli kluczem jest ostatni element, należy rzucić wyjątek. Jeśli klucz nie istnieje, wynik jest niewiarygodny.

Specjalistyczne algorytmy

Poniżej znajduje się składnia specjalistycznej funkcji algorytmu:

szablon
void swap (mapa i x, mapa i y) no -except.zamiana (y)));

Zamiast tego można użyć następującej składni:

Void swap (mapa i)

To zamienia pary dwóch map, które nie muszą być tego samego rozmiaru. Przykład:

Map MP1 = „śliczka”, „fiolet”, „mango”, „żółty”, „Blackberry”, „ciemnoniebieski-czarny”, „Passion owoc”, „fioletowe”, " banan ",„ żółty ”;
Map Mp2 = „Watermelon”, „zielony”, „winogrona”, „Pink”, „apricot”, „Orange”, „Strawberry”, „czerwony”, „Peach”, " ciemnożółty „, „ papaya ”,„ Orange ”;
MP1.swap (MP2);
Cout << "New mp1:" << endl;
dla (Auto Elem: MP1)
Cout << elem.first < " << elem.second << endl;
Cout<Cout << "New mp2:" << endl;
dla (Auto Elem: MP2)
Cout << elem.first < " << elem.second << endl;

Wniosek

Mapa składa się z par kluczy/wartości. Jest zamawiany przez klawisze, wznoszące się lub schodzące. Domyślna kolejność jest rosnąca. Podstawowe funkcje członkowskie dla mapy: map (), operator [], at (), size (), pusty (), begin (), end (), rbegin (), rend (), emplace (), insert () , Erase (), clear (), find (), dolne_bound (), upór_bound () i a1swap (a2).