C ++ kart emplace

C ++ kart emplace
I C ++ gjør Emplace () og Sett inn () funksjoner en lignende ting. Når programmereren ikke bryr seg om fordelene som Emplace har, kan han bruke innsats (). Emplace konstruerer elementet av interesse i interessebeholderen mens du setter inn kopier av elementet fra et sted eller flytter elementet inn i interessebeholderen.

Kopiering

Tenk på følgende to lister med tegn:

liste la = 'a', 'b', 'c', 'd';
liste lb = 'e', 'f', 'g', 'h';

'G' i LB kan kopieres og plasseres foran 'D' i LA, for å ha,

liste la = 'a', 'b', 'c', 'g', 'd';
liste lb = 'e', 'f', 'g', 'h';

Flytt forestillingen

'G' i LB kan fjernes og plasseres foran 'D' i LA, for å ha,

liste la = 'a', 'b', 'c', 'g', 'd';
liste lb = 'e', 'f', 'h';

Verdi i element

Kopiering og bevegelse er ikke så sløv som vist ovenfor. I en reell situasjon, hver verdi (e.g., karakter) er i et element. Så hvis en liste over chars har fire tegn, har listen fire elementer. Hvis en liste over chars har tre tegn, har listen tre elementer.

Et element kan være en struktur med 3 datamedlemmer. Det første datamedlemmet er en peker som peker på det forrige elementet på listen. Det andre datamedlemmet har verdien, i dette tilfellet, karakteren. Det tredje datamedlemmet er en peker som peker på neste element på listen.

Så hver karakter, for eksempel 'g' ovenfor, vil bli holdt av det andre datamedlemmet i en struktur. Når det har 'h'.

Sett inn og emplace

Når innsatsen () må kopiere som uttrykt ovenfor, elementet 'g', jeg.e., Den komplette strukturen, vil bli kopiert og plassert foran 'D' -elementet, i teorien. I praksis, etter at et nytt tilsvarende element anses å være plassert foran 'D' -elementet, vil det tredje datamedlemmet av den nye G -er -strukturen bli gjort for å peke på 'D' -elementet; Og det første datamedlemmet i den nye G -strukturen vil bli gjort for å peke på 'C' elementet (av List LA).

Når innsats () må bevege seg som uttrykt ovenfor, blir kopieringen som forklart her gjort, så fjernes 'g' elementet i listen LB.

Emplace () derimot trenger ikke å kopiere eller flytte noe element. Det må bare indikeres for programmet at verdien av interesse er karakteren, 'G'. Programmet vil deretter konstruere et nytt element med 'G' som verdien foran 'D' -elementet på listen, LA. Det vil si at den vil skape en ny 'G' -struktur foran 'D' -elementet, med det tredje datamedlemmet som peker på 'D' -elementet og det første datamedlemmet som peker på 'C' -elementet, som en del av konstruksjonsprosedyre.

Så hovedforskjellen mellom innsats () og emplace () er at emplace () konstruerer innsatsen på stedet på stedet, mens innsats () må kopiere eller flytte elementet.

Denne artikkelen forklarer hva Map-ExpSe er og hvordan du bruker de to hovedemedlemmer for emnets medlemmer av MAP.

Artikkelinnhold

  • Kartelementet
  • A_UNIQ.Emplace (args)
  • en.emplace_hint (P, args)
  • Konklusjon

Kartelementet

Følgende er fire fruktnavn og deres ytre farger:

banan => gul
pasjonsfrukt => lilla
vannmelon => grønn
drue => rosa

Et kart består av nøkkel/verdipar. I denne ordinære listen er navnene på fruktene nøklene, og navnene på de ytre fargene er verdiene. Imidlertid er dette en liste over par, ikke en liste over verdier alene, og ikke en liste over nøkler alene. Det er en liste over nøkkel/verdipar. Nøklene til et kart er unike.

I kode er en nøkkel og verdien kodet som et element, kalt et par. Hvert element vil bli pekt på av en iterator. Så et kartelement ser en nøkkel som en verdi, og nøkkelen tilsvarer en annen verdi. Så et kartelement trenger to verdier for å lage et element; Ikke en som uttrykt i introduksjonen ovenfor. Disse to verdiene er i noen koder, kalt et par.

Malen for kartelementet er:

par

Den første parameteren er for nøkkelen, og den er indikert som Key_Type. Den andre parameteren er for verdien som tilsvarer nøkkelen. Det er indikert som kartlagt_type og ikke verdi_type. Value_type er faktisk:

par

elementmalen. Med matrisen er indekser til verdier. Med kartet er iteratorer til par. Et par er en verdi, som kan holdes av det andre datamedlemmet i en struktur, og det tredje datamedlemmet som peker på neste element, som også har et par som verdi; og det første datamedlemmet som peker på det forrige elementet, hvis verdi er et annet par.

I frukt-/fargelisten over kan det første paret kodes som følger:

"banan", "gul"

"Banan" er nøkkelen, og "gul" er verdien, og danner et nøkkel-/verdipar. Hele kortlisten med to verdier er en verdi av verdi_type, og kan holdes av det midterste datamedlemmet til et strukturelement. Det første datamedlemmet i strukturen vil peke på det forrige elementet, og det tredje datamedlemmet av strukturen vil peke på neste element.

Nå er et par et objekt hvis nøkkel først har medlemsnavnet og hvis verdi har medlemsnavnet andre.

Følgende program legger listen over frukt/farger på et kart:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

kart mp = "banan", "gul", "pasjonsfrukt", "lilla", "watermelon", "grønn", "drue", "rosa";
for (kart:: iterator it = mp.begynne(); den != MP.slutt(); det ++)
cout << it->først << " => "" << it->sekund << endl;
retur 0;

Utgangen er:

banan => gul
pasjonsfrukt => lilla
vannmelon => grønn
drue => rosa

Merk at kartbiblioteket måtte inkluderes.

Heterogent par

Et par må ikke nødvendigvis ha en nøkkel og verdi som gir mening for den vanlige brukeren. Det kan også ha en nøkkel og verdi som ikke gir mening for den vanlige brukeren, men som gir mening for programmereren. Som et eksempel for et nøkkel/verdipar som er fornuftig for programmereren, kan nøkkelen være en iterator, og verdien, en bool -type.

A_UNIQ.Emplace (args)

Her er A_uniq navnet på kartet. Args er nøkkelen og verdien for paret, atskilt med komma. Medlemsfunksjonen returnerer et par, hvis første verdi er en iterator (verdi_type); og hvis andre verdi er en bool, for å indikere om innsatsen (konstruert på stedet) var vellykket (sant for suksess). Den returnerte iteratoren peker på det innsatte elementet. C ++ -spesifikasjonen indikerer ikke hvor innsatsen skal finne sted i listen (eller foran eller bak) for denne funksjonen. Følgende program illustrerer bruken av funksjonen:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

kart mp = "banan", "gul", "pasjonsfrukt", "lilla", "watermelon", "grønn", "drue", "rosa";
par:: iterator, bool> pr = mp.Emplace ("Strawberry", "Red");
cout << (pr.first)->først << " => "" << (pr.first)->sekund << " : " << pr.second << endl;
cout << endl;
for (kart:: iterator it = mp.begynne(); den != MP.slutt(); det ++)
cout << it->først << " => "" << it->sekund << endl;
retur 0;

Utgangen er:

jordbær => rød: 1
jordbær => rød
banan => gul
pasjonsfrukt => lilla
vannmelon => grønn
drue => rosa

1 i den første utgangslinjen betyr sant. Legg merke til hvordan Args ble kodet som (“Strawberry”, ”rødt”). Ikke forveksle mellom verdi_type og kartlagt _type.

en.emplace_hint (P, args)

Her er 'A' navnet på kartet. Denne medlemsfunksjonen ligner på ovennevnte, men posisjonen der plassering må finne sted i kartlisten foreslås. Det er en iterator, P som peker på elementet før, og nær innstilling (plassering) vil bli plassert, i minnet. Funksjonen returnerer en iterator og ikke et par. Iteratoren peker på det nylig innsatte elementet (par). Følgende program illustrerer dette:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

kart mp = "banan", "gul", "pasjonsfrukt", "lilla", "watermelon", "grønn", "drue", "rosa";
kart:: Iterator P = MP.slutt();
p--;
kart:: iterator iter = mp.emplace_hint (P, "Strawberry", "Red");
cout << iter->først << " => "" << iter->sekund << endl;
cout << endl;
for (kart:: iterator it = mp.begynne(); den != MP.slutt(); det ++)
cout << it->først << " => "" << it->sekund << endl;
retur 0;

Utgangen er:

jordbær => rød
jordbær => rød
banan => gul
pasjonsfrukt => lilla
vannmelon => grønn
drue => rosa

Konklusjon

Empete og innsats er like. Emplace konstruerer elementet på stedet på listen, etter å ha oppnådd verdien, på en eller annen måte. På den annen side, sett inn kopierer elementet inn i listen fra et sted eller flytter elementet inn i listen fra et sted.

Merk: Et kart opprettes normalt sortert etter nøkler. For å oppnå dette for kartet ovenfor, bruk strengobjekter for tastene i stedet for konstant-poeng-til-skarmer.