C ++

Edinstveni in urejeni vsebniki v jeziku C ++

Edinstveni in urejeni vsebniki v jeziku C ++
6, 10, 2, 8, 4 je niz; 2, 4, 6, 8, 10 je niz istih celih števil, razvrščenih v naraščajočem vrstnem redu. V matematiki ima množica unikatne elemente (različne elemente) in to pomeni, da se noben element ne pojavi več kot enkrat. Poleg tega je večnabor množica, kjer se lahko kateri koli element pojavi večkrat. 6, 6, 10, 2, 2, 8, 4, 4, 4 je večnabor. 2, 2, 4, 4, 4, 6, 6, 8, 10 je isti večnabor, vendar z elementi, razporejenimi v naraščajočem vrstnem redu. Ta članek ne obravnava večnastavnosti. Ukvarja se s strukturo podatkov C ++, imenovano set.

Zemljevid v programski opremi je kot matrika, vendar je matrika z dvema stolpcema namesto z enim. Prvi stolpec ima ključe, drugi stolpec pa vrednosti. Vsaka vrstica je en par, ki tvori par ključ / vrednost. Ključ je neposredno povezan z njegovo vrednostjo.

Primer zemljevida je 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Prvi par ključ / vrednost, vstavljen tukaj, je 'c', 3, kjer je 'c' ključ, 30 pa vrednost. Ta zemljevid ni urejen s ključi. Če ta zemljevid razvrstite po tipkah, dobite 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Upoštevajte, da lahko obstajajo podvojene vrednosti, vendar ne podvojeni ključi. Urejeni zemljevid je zemljevid, razvrščen po tipkah.

Multiset je naboru, kot multimap je zemljevidu. To pomeni, da obstajajo zemljevidi s podvojenimi ključi. Primer večslika je 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. In kot rečeno zgoraj, ta članek ne obravnava večslikav, temveč obravnava strukturo podatkov C ++, imenovano map.

V C ++ je podatkovna struktura struktura z lastnostmi (člani podatkov) in metodami (funkcije članov). Podatki strukture so seznam; niz je seznam; zemljevid je seznam parov ključ / vrednost.

Ta članek obravnava osnove množic in zemljevidov v jeziku C ++, za boljše razumevanje tega članka pa bi moral bralec imeti osnovno znanje jezika C++.

Vsebina članka:

Razred in njegovi predmeti:

V C ++ se množici, zemljevidu in drugim podobnim strukturam imenujejo vsebniki. Razred je posplošena enota s podatkovnimi člani, ki so spremenljivke, in članskimi funkcijami, ki so povezane. Ko dobijo podatkovni člani vrednosti, se oblikuje objekt. Vendar se objekt oblikuje v postopku, imenovanem instanciranje. Ker lahko razred pripelje do različnih vrednosti za iste spremenljivke podatkovnega člana, lahko nato iz istega razreda instantiramo različne predmete.

V jeziku C ++ je neuporaben niz razred, pa tudi neuporaben zemljevid. Ko se primer ustvari iz neuporabnega niza ali neuporabnega zemljevida, objekt postane prava podatkovna struktura. S podatkovnimi strukturami nabora in zemljevida je glavni podatkovni član seznam. No, niz in zemljevid tvorijo skupino zabojnikov, imenovanih urejeni asociativni zabojniki. Obstajata tudi neurejena množica in neurejena karta, ki pa v tem članku žal nista obravnavani.

Ustvarjanje niza ali zemljevida:

Instantiranje niza iz razreda niza ustvari niz; instanciranje zemljevida iz njegovega razreda zemljevida ustvari zemljevid. Tako ustvarjeni objekt dobi ime po izbiri programerja.

Če želite ustvariti niz, se mora program začeti z:

#include
#include
uporaba imenskega prostora std;

Upoštevajte direktivo "#include ", Ki vključuje knjižnico naborov, ki ima razred nabora, iz katerega bodo instancirane nabore podatkovne strukture.

Če želite ustvariti zemljevid, se mora program začeti z:

#include
#include
uporaba imenskega prostora std;

Upoštevajte direktivo "#include ", Ki vključuje knjižnico zemljevidov, ki ima razred zemljevida, iz katerega se bodo ustvarile podatkovne strukture zemljevidov.

Sintaksa za ustvarjanje praznega nabora je:

nastavite objectName

Primer:

nastavite setObj;

Primer ustvarjanja niza z vsebino je:

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

Sintaksa za ustvarjanje praznega zemljevida je:

zemljevid objectName

Primer:

zemljevid mapObj;

Primer ustvarjanja zemljevida z vsebino je:

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

Osnove iteratorja:

Ponavljalec je izdelan kazalec, s katerim lahko prehodite seznam podatkovne strukture od začetka do konca.

Funkcija člana begin ()

Funkcija člana begin () vrne iterator, ki kaže na prvi element seznama. Naslednji primer to ponazarja za sklop:

nastavite setObj (6, 10, 2, 8, 4);
nastavite:: iterator iter = setObj.začeti();
cout << *iter << '\n';

Upoštevajte, kako je bil začetek () uporabljen s setObj in operatorjem pik. iter je vrnjeni predmet iteratorja. Upoštevajte tudi način razglasitve. * je posredni operater. Kot se uporablja pri iterju, vrne prvi element nabora; prvi element je 2 namesto 6 - glej razlago spodaj.

Naslednji primer ponazarja uporabo funkcije begin () za zemljevid:

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

Upoštevajte, kako je bil začetek () uporabljen z mapObj in operatorjem pik. iter je vrnjeni predmet iteratorja. Upoštevajte tudi način prijave. "Prvi", kot je uporabljen tukaj, se nanaša na ključ. "Drugi" se nanaša na vrednost, ki ustreza ključu. Opazujte, kako so bili z iter uporabljeni za pridobitev komponent začetnega elementa na seznamu. Prvi element je a, 10 namesto c, 30 - glej razlago spodaj.

Funkcija člana "begin () const"

Funkcija člana “begin () const” vrne iterator, ki kaže na prvi element seznama, ko se izjava nabora začne s const (za konstanto). Pod tem pogojem vrednosti na seznamu, na katero se sklicuje vrnjeni iterator, iteratorja ne more spremeniti. Naslednji primer ponazarja njegovo uporabo v kompletu:

const set setObj (6, 10, 2, 8, 4);
nastavite:: const_iterator iter = setObj.začeti();
cout << *iter << '\n';

Upoštevajte, kako je bil začetek () uporabljen s setObj in operatorjem pik. Takoj po začetku () ni bila vnesena nobena »const«. Vendar je pred izjavo "const". iter tukaj je vrnjeni predmet konstantnega iteratorja, ki se razlikuje od običajnega iteratorja. Upoštevajte tudi način prijave. * je posredni operater; kot se uporablja z iter, vrne prvi element niza. Prvi element je 2 namesto 6 - glej razlago spodaj.

Naslednji primer ponazarja uporabo funkcije "begin () const" za zemljevid:

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

Upoštevajte, kako je bil začetek () uporabljen z mapObj in operatorjem pik. Takoj po začetku () ni bila vnesena nobena »const«. Vendar je pred izjavo "const". iter tukaj je vrnjeni konstantni iterator objekt, ki se razlikuje od običajnega iteratorja. Upoštevajte tudi način razglasitve. "Prvi", kot je uporabljen tukaj, se nanaša na ključ; "Drugi", kot je uporabljen tukaj, se nanaša na vrednost, ki ustreza ključu. Opazujte, kako so bili z iter uporabljeni za pridobitev komponent začetnega elementa na seznamu. Prvi element je a, 10 namesto c, 30 - glej razlago spodaj.

Funkcija končnega () člana

Funkcija člana end () vrne iterator, ki kaže takoj po koncu seznama. Naslednji primer to ponazarja za sklop:

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

Upoštevajte, kako je bil end () uporabljen s setObj in operatorjem pike. iter je vrnjeni predmet iteratorja. Upoštevajte tudi način razglasitve. * je posredni operater; kot se uporablja z iter, vrne zadnji + 1 element nabora. V avtorskem računalniku je ta zadnji +1 element 5, kar ni na seznamu. Torej, previdno, da ne uporabite tega elementa.

Naslednji primer ponazarja uporabo funkcije end () za zemljevid:

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

Upoštevajte, kako je bil end () uporabljen z mapObj in operatorjem pik. iter je vrnjeni predmet iteratorja. Upoštevajte tudi način razglasitve. * je posredni operater; kot se uporablja z iter, vrne zadnji + 1 element zemljevida. V avtorskem računalniku je ta zadnji +1 element , 0, ki ga ni na seznamu. Torej, previdno, da ne uporabite tega elementa.

Funkcija člana "end () const"

Funkcija člana "end () const" vrne iterator, ki kaže takoj po koncu seznama, ko se izjava nabora začne s const (za konstanto). Pod tem pogojem iteratorja ne more spremeniti vrednosti na seznamu, na katero se sklicuje vrnjeni iterator. Naslednji primer ponazarja njegovo uporabo v kompletu:

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

Upoštevajte, kako je bil end () uporabljen s setObj in operatorjem pik. Takoj po koncu ni bila vnesena nobena »const« (). Vendar je pred izjavo "const". iter je vrnjeni predmet iteratorja. Upoštevajte tudi način razglasitve. * je posredni operater; kot se uporablja z iter, vrne zadnji + 1 element nabora.

Naslednji primer ponazarja uporabo funkcije "end () const" za zemljevid:

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

Upoštevajte, kako je bil end () uporabljen z mapObj in operatorjem pik. Takoj po koncu ni vtipkana nobena »const« (). Vendar je pred izjavo "const". iter je vrnjeni konstantni iterator objekt, ki se razlikuje od običajnega iteratorja. Prav tako natančno opazujte način razglasitve.

Dostop do elementa za nabor in zemljevid:

Nastavite

Pri naboru se element bere s pomočjo posrednega operatorja. Prva dva elementa nabora se bereta v naslednjem primeru:

nastavite setObj (6, 10, 2, 8, 4);
nastavite:: iterator iter = setObj.začeti();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Izhod je 2, nato sledi 4 - glej razlago spodaj. Za usmeritev na naslednji element seznama se poveča iterator.

Opomba: Elementa ni mogoče spremeniti s pomočjo posrednika za nabor. Na primer, "* iter = 9;" ni mogoča.

zemljevid

Zemljevid je sestavljen iz parov ključ / vrednost. Vrednost je mogoče prebrati z ustreznim ključem in spremeniti z istim ključem. To ponazarja naslednji segment kode:

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

Rezultat je:

20
55

Operator pike tukaj ni bil uporabljen. Namesto tega je uporabljen operator v oglatih oklepajih, ki jemlje ključ kot vsebino.

Vrstni red elementov v nizu ali zemljevidu:

Elemente lahko vstavite v niz v poljubnem vrstnem redu. Ko pa komplet enkrat vstavi, svoje elemente prerazporedi v naraščajočem vrstnem redu. Naraščajoči vrstni red je privzeti vrstni red. Če je potreben padajoči vrstni red, je treba navesti niz, kot v naslednjem primeru:

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

Torej, po vrsti, npr.g., int, za predlogo je vejica, ki ji sledi »večja«V kotnih oklepajih.

Elemente lahko vstavite na zemljevid v poljubnem vrstnem redu. Ko pa zemljevid enkrat vstavi, svoje elemente razvrsti po naraščajočem vrstnem redu po ključu (samo), hkrati pa ohrani razmerje med posameznim ključem in njegovo vrednostjo. Naraščajoči vrstni red je privzeti vrstni red; če je potreben padajoči vrstni red, je treba zemljevid prijaviti kot v naslednjem primeru:

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

Torej, po paru tipov, npr.g., »Char, int«, za predlogo je vejica, ki ji sledi »večja«V kotnih oklepajih.

Prečkanje niza

Z zanko while ali for-loop z iteratorjem lahko prehodite niz. Naslednji primer uporablja for-zanko za prehod nabora, ki je bil konfiguriran v padajočem vrstnem redu:

nastavite > setObj (6, 10, 2, 8, 4);
za (set:: iterator iter = setObj.začeti(); iter != setObj.konec (); ++ iter)

cout << *iter << ";

Rezultat je:

10 8 6 4 2

Povečanje iteratorja ga usmeri na naslednji element.

Premikanje po zemljevidu

Zanko while ali for-loop z iteratorjem lahko uporabite za prehod zemljevida. Naslednji primer uporablja for-zanko za prehod zemljevida, ki je bil konfiguriran v padajočem vrstnem redu:

zemljevid > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
za (zemljevid:: iterator iter = mapObj.začeti(); iter != mapObj.konec (); ++ iter)

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

Rezultat je:

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

Povečanje iteratorja ga usmeri na naslednji element. "Prvi" se v kodi nanaša na ključ, "drugi" pa na ustrezno vrednost. Upoštevajte, kako so bile te vrednosti pridobljene za rezultat.

Druge pogosto uporabljene funkcije članov:

Velikost () Funkcija

Ta funkcija vrne celo število, ki je število elementov na seznamu. Postavite primer:

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

Izhod je 5.

Primer zemljevida:

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

Izhod je 5.

Funkcija vstavitve ()

nastavite

nabor ne omogoča podvajanja. Torej je vsak vstavljeni dvojnik tiho zavrnjen. Pri naboru je argument funkcije insert () vrednost, ki jo je treba vstaviti. Vrednost se prilagodi položaju, pri katerem vrstni red v nizu ostane naraščajoč ali padajoč. Primer:

nastavite setObj (6, 10, 2, 8, 4);
setObj.vložek (6);
setObj.vložek (9);
setObj.vložek (12);
za (set:: iterator iter = setObj.začeti(); iter != setObj.konec (); ++ iter)

cout << *iter << ";

Rezultat je:

2 4 6 8 9 10 12

Opomba: Funkcijo vstavka () lahko uporabite za zapolnitev praznega nabora.

zemljevid

map ne dovoljuje podvajanja po ključu. Torej je vsak vstavljeni dvojnik tiho zavrnjen. Pri zemljevidu je argument funkcije insert () par ključ / vrednost v oklepajih. Element se s ključem namesti v položaj, pri katerem vrstni red na zemljevidu ostane naraščajoč ali padajoč. Primer:

zemljevid mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.vstavi ('e', 80);
mapObj.vstavi ('f', 50);
mapObj.vstavi ('g', 60);
za (zemljevid:: iterator iter = mapObj.začeti(); iter != mapObj.konec (); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Rezultat je:

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

Opomba: Funkcijo vstavka () lahko uporabite za zapolnitev praznega zemljevida.

Funkcija empty ()

Ta funkcija vrne true, če je seznam prazen, in false, če je drugače. Postavite primer:

nastavite setObj (6, 10, 2, 8, 4);
bool ret = setObj.prazno();
cout << ret << '\n';

Izhod je 0 za false, kar pomeni, da tukaj ni prazen.

Primer zemljevida:

zemljevid mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.prazno();
cout << ret << '\n';

Izhod je 0 za false, kar pomeni, da zemljevid tukaj ni prazen.

Funkcija brisanja ()

nastavite

Upoštevajte naslednji segment kode:

nastavite setObj (10, 20, 30, 40, 50);
nastavite:: iterator iter = setObj.začeti();
nastavite:: iterator itr = setObj.izbriši (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.izbriši (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Rezultat je:

nova velikost: 4
naslednja vrednost: 20
nova velikost: 3
naslednja vrednost: 30

Funkcija erase () vzame iterator, ki kot argument kaže na element. Po izbrisu elementa funkcija erase () vrne iterator, ki kaže na naslednji element.

zemljevid

Upoštevajte naslednji segment kode:

zemljevid mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
zemljevid:: iterator iter = mapObj.začeti();
zemljevid:: iterator itr = mapObj.izbriši (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.izbriši (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Rezultat je:

nova velikost: 4
naslednji vrednostni par: b, 20
nova velikost: 3
naslednji par vrednosti: c, 30

Funkcija erase () vzame iterator, ki kot argument kaže na element. Po izbrisu elementa funkcija erase () vrne iterator, ki kaže na naslednji element.

Funkcija clear ()

Funkcija clear () odstrani vse elemente na seznamu. Postavite primer:

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

Izhod je 0.

primer zemljevida:

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

Izhod je 0.

Zaključek:

Nastavljena podatkovna struktura v jeziku C ++ je struktura, v kateri je seznam elementov privzeto shranjen v naraščajočem vrstnem redu ali v padajočem vrstnem redu po izbiri programerja. Vsi elementi kompleta so unikatni. Podatkovna struktura zemljevida v jeziku C ++ je struktura, v kateri je seznam razpršen par parov ključ / vrednost, privzeto shranjen v naraščajočem vrstnem redu ključev ali v padajočem vrstnem redu ključev po izbiri programerja. Tudi ključi so edinstveni in lahko so podvojene vrednosti. Glavni podatkovni član katere koli od struktur je seznam. Vsaka struktura ima funkcije članov, nekatere pa so pogosto uporabljene.

Kako namestiti in igrati Doom v Linuxu
Uvod v Doom Serija Doom je nastala v devetdesetih letih po izidu prvotnega Dooma. Bil je takojšen hit in od takrat naprej je serija iger prejela števi...
Vulkan za uporabnike Linuxa
Z vsako novo generacijo grafičnih kart vidimo, da razvijalci iger premikajo meje grafične zvestobe in se približujejo fotorealizmu. A kljub vsem kredi...
OpenTTD vs Simutrans
Ustvarjanje lastne simulacije prevoza je lahko zabavno, sproščujoče in izjemno vabljivo. Zato morate preizkusiti čim več iger, da boste našli tisto, k...