C ++

Unike og bestilte containere i C ++

Unike og bestilte containere i C ++
6, 10, 2, 8, 4 er et sett; 2, 4, 6, 8, 10 er et sett med samme heltall, ordnet i stigende rekkefølge. I matematikk har et sett unike elementer (distinkte elementer), og det vil si at ingen elementer forekommer mer enn en gang. Videre er et multisett et sett der ethvert element kan forekomme mer enn en gang. 6, 6, 10, 2, 2, 8, 4, 4, 4 er et multisett. 2, 2, 4, 4, 4, 6, 6, 8, 10 er samme multisett, men med elementene ordnet i stigende rekkefølge. Denne artikkelen handler ikke om multisett. Den tar for seg C ++ datastrukturen kalt set.

Et kart i programvare er som en matrise, men det er en matrise med to kolonner i stedet for en. Den første kolonnen har nøklene og den andre kolonnen har verdiene. Hver rad er ett par, og lager et nøkkel / verdipar. En nøkkel er direkte relatert til verdien.

Et eksempel på et kart er 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Det første nøkkel / verdiparet som er satt inn her, er 'c', 3, hvor 'c' er nøkkelen og 30 er verdien. Dette kartet er ikke ordnet etter nøkler. Å bestille dette kartet med tastene produserer 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Legg merke til at det kan være dupliserte verdier, men ikke dupliserte nøkler. Et bestilt kart er et kart bestilt etter nøkler.

Et multisett er til et sett, som et multikart er et kart. Dette betyr at det er kart med dupliserte nøkler. Et eksempel på et multikart er 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. Og som nevnt ovenfor handler denne artikkelen ikke om multimap, men snarere om C ++ datastrukturen kalt map.

I C ++ er en datastruktur en struktur med egenskaper (datamedlemmer) og metoder (medlemsfunksjoner). Dataene til strukturen er en liste; et sett er en liste; et kart er en liste over nøkkel- / verdipar.

Denne artikkelen diskuterer det grunnleggende om sett og kart i C ++, og for å forstå denne artikkelen bedre, burde leseren ha hatt grunnleggende kunnskap om C++.

Artikkelinnhold:

Klasse og dens gjenstander:

I C ++ kalles settet, kartet og andre lignende strukturer containere. En klasse er en generalisert enhet med data-medlemmer, som er variabler, og medlemsfunksjoner som er relatert. Når data-medlemmer får verdier, dannes et objekt. Imidlertid blir et objekt dannet i en prosess som kalles instantiering. Ettersom en klasse kan føre til forskjellige verdier for de samme dataelementvariablene, kan forskjellige objekter deretter instantieres fra samme klasse.

I C ++ er et ubrukelig sett en klasse, så vel som et ubrukelig kart. Når et objekt instantiseres fra det ubrukelige settet eller det ubrukelige kartet, blir objektet den virkelige datastrukturen. Med sett- og kartdatastrukturene er hoveddatamedlemmet en liste. Sett, og kartet danner en gruppe containere kalt, bestilte assosiative containere. Ubestilt sett og det uordnede kartet eksisterer også, men de er dessverre ikke omtalt i denne artikkelen.

Opprette et sett eller et kart:

Instantiering av et sett fra sin settklasse er å lage et sett; å sette i gang et kart fra kartklassen er å lage et kart. Objektet som ble opprettet får et navn som programmereren velger.

For å lage et sett, bør programmet begynne med:

#inkludere
#inkludere
bruker navneområde std;

Legg merke til direktivet “#include ”, Som inkluderer settbiblioteket som har settklassen som sett datastrukturer vil bli instantiert fra.

For å lage et kart, bør programmet begynne med:

#inkludere
#inkludere
bruker navneområde std;

Legg merke til direktivet “#include ”, Som inkluderer kartbiblioteket som har kartklassen som kartdatastrukturer vil bli instantiert fra.

Syntaksen for å lage et tomt sett er:

sett objektnavn

Eksempel:

sett setObj;

Et eksempel på å lage et sett med innhold er:

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

Syntaksen for å lage et tomt kart er:

kart objektnavn

Eksempel:

kart mapObj;

Et eksempel på å lage et kart med innhold er:

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

Grunnleggende om Iterator:

En iterator er en forseggjort peker, som kan brukes til å krysse listen over datastrukturen fra begynnelse til slutt.

Begynn () medlem Funksjon

Begynn () medlemsfunksjonen returnerer en iterator som peker på det første elementet i listen. Følgende eksempel illustrerer dette for settet:

sett setObj (6, 10, 2, 8, 4);
sett:: iterator iter = setObj.begynne();
cout << *iter << '\n';

Legg merke til måten begin () har blitt brukt med setObj og prikkoperatøren. iter er det returnerte iteratorobjektet. Legg også merke til måten det er erklært på. * er indireksjonsoperatøren. Som brukt med iter, returnerer det det første elementet i settet; det første elementet er 2 i stedet for 6 - se forklaring nedenfor.

Følgende eksempel illustrerer bruken av start () -funksjonen for kartet:

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

Legg merke til måten begin () har blitt brukt med mapObj og prikkoperatøren. iter er det returnerte iteratorobjektet. Legg også merke til måten det er erklært på. "Første", som brukt her, refererer til nøkkelen. "Andre" refererer til verdien som tilsvarer nøkkelen. Observer hvordan de har blitt brukt med iter for å skaffe startelementkomponentene i listen. Det første elementet er a, 10 i stedet for c, 30 - se forklaring nedenfor.

Funksjonen "begin () const"

Medlemfunksjonen "begynn () const" returnerer en iterator som peker på det første elementet i listen når erklæringen til settet begynner med const (for konstant). Under denne betingelsen kan ikke verdien i listen, referert til av iteratoren som returneres, endres av iteratoren. Følgende eksempel illustrerer bruken av settet:

const sett setObj (6, 10, 2, 8, 4);
sett:: const_iterator iter = setObj.begynne();
cout << *iter << '\n';

Legg merke til måten begin () har blitt brukt med setObj og prikkoperatøren. Ingen "const" har blitt skrevet like etter start (). Imidlertid har "const" gått foran erklæringen. iter her er det returnerte konstante iteratorobjektet, som er forskjellig fra den normale iteratoren. Legg også merke til måten det er erklært på. * er indireksjonsoperatøren; som brukt med iter, returnerer det det første elementet i settet. Det første elementet er 2 i stedet for 6 - se forklaring nedenfor.

Følgende eksempel illustrerer bruken av “start () const” -funksjonen for kartet:

const kart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kart:: const_iterator iter = mapObj.begynne();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Legg merke til måten begin () har blitt brukt med mapObj og prikkoperatøren. Ingen “const” har blitt skrevet like etter start (). Imidlertid har "const" gått foran erklæringen. iter her er det returnerte konstante iteratorobjektet, som er forskjellig fra den normale iteratoren. Legg også merke til måten det er erklært på. "Første", som brukt her, refererer til nøkkelen; “Andre”, som brukt her, refererer til verdien som tilsvarer nøkkelen. Observer hvordan de har blitt brukt med iter for å skaffe startelementkomponentene i listen. Det første elementet er a, 10 i stedet for c, 30 - se forklaring nedenfor.

End () medlem Funksjon

End () medlemsfunksjonen returnerer en iterator som peker like etter slutten av listen. Følgende eksempel illustrerer dette for settet:

sett setObj (6, 10, 2, 8, 4);
sett:: iterator iter = setObj.slutt();
cout << *iter << '\n';

Legg merke til hvordan end () har blitt brukt med setObj og prikkoperatøren. iter er det returnerte iteratorobjektet. Legg også merke til måten det er erklært på. * er indireksjonsoperatøren; som brukt med iter, returnerer det siste + 1 elementet i settet. På forfatterens datamaskin er dette siste + 1-elementet 5, som ikke er på listen. Så vær forsiktig så du ikke bruker dette elementet.

Følgende eksempel illustrerer bruken av end () -funksjonen for kartet:

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

Legg merke til hvordan end () har blitt brukt med mapObj og prikkoperatøren. iter er det returnerte iteratorobjektet. Legg også merke til måten det er erklært på. * er indireksjonsoperatøren; som brukt med iter, returnerer den det siste + 1-elementet på kartet. På forfatterens datamaskin er dette siste + 1-elementet , 0, som ikke er på listen. Så vær forsiktig så du ikke bruker dette elementet.

"End () const" -medlemmen Funksjon

"End () const" medlemsfunksjonen returnerer en iterator som peker rett etter slutten av listen når erklæringen til settet begynner med const (for konstant). Under denne betingelsen kan ikke verdien i listen, referert til av iteratoren som returneres, endres av iteratoren. Følgende eksempel illustrerer bruken av settet:

const sett setObj (6, 10, 2, 8, 4);
sett:: const_iterator iter = setObj.slutt();
cout << *iter << '\n';

Legg merke til hvordan end () har blitt brukt med setObj og prikkoperatøren. Ingen “const” har blitt skrevet like etter slutten (). Imidlertid har "const" gått foran erklæringen. iter er det returnerte iteratorobjektet. Legg også merke til måten det er erklært på. * er indireksjonsoperatøren; som brukt med iter, returnerer det siste + 1 elementet i settet.

Følgende eksempel illustrerer bruken av "end () const" -funksjonen for kartet:

const kart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kart:: const_iterator iter = mapObj.slutt();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Legg merke til hvordan end () har blitt brukt med mapObj og prikkoperatøren. Ingen “const” har blitt skrevet like etter slutten (). Imidlertid har "const" gått foran erklæringen. iter er det returnerte konstante iteratorobjektet, som er forskjellig fra den normale iteratoren. Vær også nøye med på måten den er erklært på.

Element Access for sett og kart:

Sett

Med settet leses elementet ved hjelp av indireksjonsoperatøren. De to første elementene i et sett leses i følgende eksempel:

sett setObj (6, 10, 2, 8, 4);
sett:: iterator iter = setObj.begynne();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Utgangen er 2, deretter etterfulgt av 4 - se forklaring nedenfor. For å peke på neste element på listen, økes iteratoren.

Merk: Et element kan ikke endres ved hjelp av indireksjonsoperatøren for settet. For eksempel “* iter = 9;” det er ikke mulig.

kart

Et kart består av nøkkel / verdipar. En verdi kan leses ved hjelp av tilsvarende tast, og endres med samme tast. Følgende kodesegment illustrerer dette:

kart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj['b'] << '\n';
mapObj ['b'] = 55;
cout << mapObj['b'] << '\n';

Utgangen er:

20
55

Punktoperatøren har ikke blitt brukt her. I stedet er det firkantede parentesoperatøren, som tar nøkkelen som innhold, som har blitt brukt.

Elementsrekkefølge i et sett eller kart:

Elementer kan settes inn i et sett, i hvilken som helst rekkefølge. Når det er satt inn, omorganiserer det imidlertid elementene i stigende rekkefølge. Stigende ordre er standardordren. Hvis nedadgående rekkefølge er nødvendig, må settet deklareres som i følgende eksempel:

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

Så etter typen, e.g., int, for malen er det et komma, etterfulgt av “større”I vinkelparentene.

Elementer kan settes inn i et kart i hvilken som helst rekkefølge. Når kartet først er satt inn, omorganiserer det elementene i stigende rekkefølge etter nøkkel (bare) mens det opprettholder forholdet mellom hver nøkkel og verdien. Stigende ordre er standardordren; Hvis nedadgående rekkefølge er nødvendig, må kartet deklareres som i følgende eksempel:

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

Så etter typeparet, e.g., “Char, int”, for malen er det et komma, etterfulgt av “større”I vinkelparentene.

Krysser et sett

Mens loop eller for-loop med iteratoren kan brukes til å krysse et sett. Følgende eksempel bruker en for-loop for å krysse et sett som er konfigurert i synkende rekkefølge:

sett > setObj (6, 10, 2, 8, 4);
for (sett:: iterator iter = setObj.begynne(); iter != settObj.slutt(); ++ iter)

cout << *iter << ";

Utgangen er:

10 8 6 4 2

Å inkrementere en iterator peker den mot neste element.

Kryssing av et kart

Mens loop eller for-loop med iteratoren kan brukes til å krysse et kart. Følgende eksempel bruker en for-loop for å krysse et kart som er konfigurert i synkende rekkefølge:

kart > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
for (kart:: iterator iter = mapObj.begynne(); iter != kartObj.slutt(); ++ iter)

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

Utgangen er:

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

Å inkrementere en iterator peker den mot neste element. "Første", i koden, refererer til nøkkelen og "andre" refererer til den tilsvarende verdien. Legg merke til hvordan disse verdiene er oppnådd for utdataene.

Andre ofte brukte medlemsfunksjoner:

Størrelsen () Funksjon

Denne funksjonen returnerer et helt tall, som er antall elementer i listen. Sett eksempel:

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

Utgangen er 5.

Karteksempel:

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

Utgangen er 5.

Sett inn () -funksjonen

sett

sett tillater ikke duplikat. Så, ethvert duplikat som settes inn, avvises stille. Med settet er argumentet til innsettingsfunksjonen () verdien som skal settes inn. Verdien er plassert i en posisjon der rekkefølgen i settet forblir stigende eller synkende. Eksempel:

sett setObj (6, 10, 2, 8, 4);
settObj.innsats (6);
settObj.innsats (9);
settObj.innsats (12);
for (sett:: iterator iter = setObj.begynne(); iter != settObj.slutt(); ++ iter)

cout << *iter << ";

Utgangen er:

2 4 6 8 9 10 12

Merk: Funksjonen insert () kan brukes til å fylle ut et tomt sett.

kart

kart tillater ikke duplisering etter nøkkel. Så, ethvert duplikat som settes inn, avvises stille. Med kartet er argumentet til insert () -funksjonen nøkkel / verdipar i parentes. Elementet monteres i en posisjon med nøkkel, hvor rekkefølgen på kartet forblir stigende eller synkende. Eksempel:

kart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kartObj.sett inn ('e', 80);
kartObj.sett inn ('f', 50);
kartObj.sett inn ('g', 60);
for (kart:: iterator iter = mapObj.begynne(); iter != kartObj.slutt(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Utgangen er:

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

Merk: Insert () medlemsfunksjonen kan brukes til å fylle ut et tomt kart.

Den tomme () funksjonen

Denne funksjonen returnerer true hvis listen er tom, og falsk hvis ikke annet. Sett eksempel:

sett setObj (6, 10, 2, 8, 4);
bool ret = setObj.tømme();
cout << ret << '\n';

Utgangen er 0 for falsk, noe som betyr at settet her ikke er tomt.

Karteksempel:

kart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.tømme();
cout << ret << '\n';

Utgangen er 0 for falsk, noe som betyr at kartet her ikke er tomt.

Slette () -funksjonen

sett

Vurder følgende kodesegment:

sett setObj (10, 20, 30, 40, 50);
sett:: iterator iter = setObj.begynne();
sett:: iterator itr = setObj.slette (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.slette (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Utgangen er:

ny størrelse: 4
neste verdi: 20
ny størrelse: 3
neste verdi: 30

Slette () -funksjonen tar en iterator som peker på et element som et argument. Etter at elementet er slettet, returnerer funksjonen erase () en iterator som peker på neste element.

kart

Vurder følgende kodesegment:

kart mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
kart:: iterator iter = mapObj.begynne();
kart:: iterator itr = mapObj.slette (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.slette (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Utgangen er:

ny størrelse: 4
neste verdipar: b, 20
ny størrelse: 3
neste verdipar: c, 30

Slette () -funksjonen tar en iterator som peker på et element som et argument. Etter at elementet er slettet, returnerer funksjonen erase () en iterator som peker på neste element.

Den klare () funksjonen

Clear () -funksjonen fjerner alle elementene i listen. Sett eksempel:

sett setObj (6, 10, 2, 8, 4);
settObj.klar();
cout << setObj.size() << '\n';

Utgangen er 0.

karteksempel:

kart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kartObj.klar();
cout << mapObj.size() << '\n';

Utgangen er 0.

Konklusjon:

En angitt datastruktur i C ++ er en struktur der listen over elementer lagres i stigende rekkefølge som standard, eller i fallende rekkefølge etter programmererens valg. Alle elementene i settet er unike. En kartdatastruktur i C ++ er en struktur der listen er en hash av nøkkel / verdipar, lagret i stigende rekkefølge av taster som standard, eller i synkende rekkefølge av nøkler etter programmererens valg. Tastene er også unike, og det kan være dupliserte verdier. Hoveddatamedlemmet til en av strukturene er listen. Enten struktur har medlemsfunksjoner, hvorav noen ofte brukes.

Beste spill å spille med håndsporing
Oculus Quest introduserte nylig den gode ideen om håndsporing uten kontrollere. Med et stadig økende antall spill og aktiviteter som utfører støtte en...
Hvordan vise OSD-overlegg i fullskjerm Linux-apper og spill
Å spille fullskjermspill eller bruke apper i distraksjonsfri fullskjermmodus kan avskrekke deg fra relevant systeminformasjon som er synlig i et panel...
Topp 5 spillfangstkort
Vi har alle sett og elsket streaming av spill på YouTube. PewDiePie, Jakesepticye og Markiplier er bare noen av de beste spillerne som har tjent milli...