C ++ Map Emplace

C ++ Map Emplace
W funkcjach C ++, emplace () i insert () robią podobne rzeczy. Kiedy programista nie dba o zalety, które ma Emplace, może użyć INSERT (). Emplace konstruuje element zainteresowania w obszarze zainteresowania, jednocześnie wstawiając kopie elementu z miejsca lub przeniesienie elementu do pojemnika.

Kopiowanie pojęcia

Rozważ następujące dwie listy znaków:

lista la = „a”, „b”, „c”, „d”;
lista lb = „e”, „f”, „g”, „h”;

„G” w LB można kopiować i umieścić przed „D” w LA, aby mieć,

lista la = „a”, „b”, „c”, „g”, 'd';
lista lb = „e”, „f”, „g”, „h”;

Przenieś pojęcie

„G” w LB można usunąć i umieścić przed „D” w LA, aby mieć,

lista la = „a”, „b”, „c”, „g”, 'd';
lista lb = „e”, „f”, „h”;

Wartość w elemencie

Kopiowanie i poruszanie się nie są tak tępe, jak pokazano powyżej. W prawdziwej sytuacji każda wartość (e.G., charakter) jest w elemencie. Jeśli więc lista znów ma cztery znaki, lista ma cztery elementy. Jeśli lista znaków ma trzy znaki, lista ma trzy elementy.

Elementem może być struktura z 3 elementami danych. Pierwszy członek danych to wskaźnik, który wskazuje poprzedni element na liście. Drugi element danych posiada wartość, w tym przypadku znak. Trzeci członek danych to wskaźnik, który wskazuje następny element na liście.

Tak więc każda postać, taka jak „g” powyżej, byłby w posiadaniu drugiego członka danych struktury. W przypadku oryginalnej listy powyżej, a dla „g”, pierwszy członek danych struktury, wskazałby element, który ma „f”, a trzeci członek danych struktury wskazałby na element, który ma „h”.

Wstaw i emplace

Kiedy Insert () musi kopiować jak wyrażone powyżej, element „g”, i.mi., Całkowita struktura zostanie skopiowana i umieszczona przed elementem „D”, teoretycznie. W praktyce, po tym, jak nowy odpowiedni element jest uważany za umieszczony przed elementem „D”, trzeci członek danych nowej struktury G zostanie skierowany do elementu „D”; a pierwszy członek danych nowej struktury G zostanie skierowany do elementu „C” (z listy LA).

Gdy Insert () musi się poruszać zgodnie z powyższym, kopiowanie jak wyjaśniono tutaj, wówczas element „g” na liście LB jest usuwany.

Emplace () z drugiej strony tak naprawdę nie musi kopiować ani przenosić żadnego elementu. Trzeba po prostu wskazać programowi, że wartością zainteresowania jest postać „g”. Następnie program zbuduje nowy element z „g” jako wartością przed elementem „D” na liście, LA. Oznacza to, że utworzy nowy struktura „g” przed elementem „d”, a trzeci element danych wskazuje na element „d” i pierwszy element danych wskazujący na element „c”, jako część Procedura budowy.

Tak więc główną różnicą między insert () i emplace () jest to, że emplace () konstruuje element wsterujący na miejscu, podczas gdy insert () musi skopiować lub przesuwać element.

W tym artykule wyjaśniono, czym jest Map-Emplace i jak korzystać z dwóch głównych funkcji członka EMPLACE MAP.

Treść artykułu

  • Element mapy
  • A_uniq.emplace (args)
  • A.emplace_hint (p, args)
  • Wniosek

Element mapy

Oto cztery nazwy owoców i ich zewnętrzne kolory:

banan => żółty
Passion owoce => fioletowe
Watermelon => zielony
winogron => różowy

Mapa składa się z par kluczy/wartości. Na tej zwykłej liście nazwy owoców to klucze, a nazwy kolorów zewnętrznych są wartościami. Jest to jednak lista par, a nie tylko lista wartości, a nie lista samych kluczy. Jest to lista par kluczy/wartości. Klucze mapy są wyjątkowe.

W kodzie klucz i jego wartość są kodowane jako element, zwany parą. Każdy element byłby wskazany przez iterator. Tak więc element mapy postrzega klucz jako wartość, a klucz odpowiada innej wartości. Tak więc element mapy potrzebuje dwóch wartości, aby utworzyć element; nie jeden, jak wyrażono we wstępie. Te dwie wartości są w pewnym kodzie, zwane parą.

Szablon elementu mapy to:

para

Pierwszy parametr dotyczy klucza i jest wskazany jako key_type. Drugi parametr dotyczy wartości odpowiadającej klucza. Jest wskazany jako Maped_Type, a nie wartość_type. wartość_type jest właściwie:

para

szablon elementu. Z tablicą indeksy są do wartości. Z mapą iteratorzy są do par. Para to wartość, którą może być utrzymywany przez drugiego członka danych struktury, a trzeci element danych wskazujący na następny element, który ma również parę jako wartość; i pierwszy członek danych wskazujący na poprzedni element, którego wartość to inna para.

Na powyższej liście owoców/kolorów pierwszą parę można zakodować w następujący sposób:

„banan”, „żółty”

„Banana” jest kluczem, a „żółty” to wartość, tworząc parę klucza/wartości. Cała krótka lista dwóch wartości jest wartością wartości_typu i może być przechowywana przez środkowy element danych elementu struct. Pierwszy element danych struktury wskazuje na poprzedni element, a trzeci element danych struktury wskazuje na następny element.

Teraz para jest obiektem, którego klucz ma nazwę członka, a którego wartość ma nazwę członka drugą.

Poniższy program umieszcza powyższą listę owoców/kolorów na mapie:

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

mapa mp = „banana”, „żółty”, „Passion owoc”, „fioletowy”, „Watermelon”, „zielony”, „winogron”, „róż”;
dla (mapa:: iterator it = mp.zaczynać(); To != MP.koniec(); it ++)
Cout << it->Pierwszy << " => " << it->drugi << endl;
powrót 0;

Wyjście to:

banan => żółty
Passion owoce => fioletowe
Watermelon => zielony
winogron => różowy

Zauważ, że biblioteka map musiała zostać uwzględniona.

Heterogeniczna para

Para niekoniecznie może mieć klucz i wartość, która ma sens dla zwykłego użytkownika. Może również mieć klucz i wartość, która nie ma sensu dla zwykłego użytkownika, ale ma sens dla programisty. Jako przykład pary klucza/wartości, która ma sens dla programisty, klucz może być iterator i wartość, typ bool.

A_uniq.emplace (args)

Tutaj A_UNIQ to nazwa mapy. ARG są kluczem i wartością dla pary, oddzielone przecinkiem. Funkcja członka zwraca parę, której pierwszą wartością jest iterator (wartość_type); i którego drugą wartością jest bool, aby wskazać, czy wstawienie (skonstruowane na miejscu) zakończyło się sukcesem (prawdziwe sukces). Zwrócony iterator wskazuje na włożony element. Specyfikacja C ++ nie wskazuje, gdzie wstawienie powinno odbywać się na liście (lub z przodu lub z tyłu) dla tej funkcji. Poniższy program ilustruje użycie funkcji:

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

mapa mp = „banana”, „żółty”, „Passion owoc”, „fioletowy”, „Watermelon”, „zielony”, „winogron”, „róż”;
para:: iterator, bool> pr = mp.emplace („Strawberry”, „czerwony”);
Cout << (pr.first)->Pierwszy << " => " << (pr.first)->drugi << " : " << pr.second << endl;
Cout << endl;
dla (mapa:: iterator it = mp.zaczynać(); To != MP.koniec(); it ++)
Cout << it->Pierwszy << " => " << it->drugi << endl;
powrót 0;

Wyjście to:

Strawberry => czerwony: 1
Strawberry => czerwony
banan => żółty
Passion owoce => fioletowe
Watermelon => zielony
winogron => różowy

1 W pierwszej linii wyjściowej oznacza prawdziwe. Zwróć uwagę, jak Args został zakodowany jako („truskawkowy”, „czerwony”). Nie myl między wartością_typem a typem _typ.

A.emplace_hint (p, args)

Tutaj „A” to nazwa mapy. Ta funkcja członka jest podobna do powyższego, ale sugerowana jest pozycja, w której umieszczenie musi mieć miejsce na liście map. Jest to iterator, P wskazujący na element przed i w pobliżu którego wstawienie (umieszczanie) zostanie umieszczone w pamięci. Funkcja zwraca iterator, a nie parę. Iterator wskazuje na nowo włożony element (para). Poniższy program ilustruje to:

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

mapa mp = „banana”, „żółty”, „Passion owoc”, „fioletowy”, „Watermelon”, „zielony”, „winogron”, „róż”;
mapa:: iterator p = mp.koniec();
P--;
mapa:: iterator iter = mp.emplace_hint (p, „Strawberry”, „czerwony”);
Cout << iter->Pierwszy << " => " << iter->drugi << endl;
Cout << endl;
dla (mapa:: iterator it = mp.zaczynać(); To != MP.koniec(); it ++)
Cout << it->Pierwszy << " => " << it->drugi << endl;
powrót 0;

Wyjście to:

Strawberry => czerwony
Strawberry => czerwony
banan => żółty
Passion owoce => fioletowe
Watermelon => zielony
winogron => różowy

Wniosek

Emplace i wstawka są podobne. Emplace konstruuje swój element na miejscu na liście, po uzyskaniu wartości, jakoś. Z drugiej strony wstaw kopie swojego elementu na listę lub przesuwa element na listę z miejsca.

Uwaga: mapa jest zwykle tworzona według klawiszy. Aby to osiągnąć dla powyższej mapy, użyj obiektów ciągów dla klawiszy zamiast stałych punktów do kanałów.