C ++

Ainulaadsed ja tellitud mahutid C ++ keeles

Ainulaadsed ja tellitud mahutid C ++ keeles
6, 10, 2, 8, 4 on komplekt; 2, 4, 6, 8, 10 on samade täisarvude kogum, mis on järjestatud kasvavas järjekorras. Matemaatikas on komplektil unikaalsed elemendid (erinevad elemendid) ja see tähendab, et ühtegi elementi ei esine rohkem kui üks kord. Lisaks on multiset komplekt, kus iga element võib esineda rohkem kui üks kord. 6, 6, 10, 2, 2, 8, 4, 4, 4 on multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 on sama multiset, kuid elemendid on järjestatud kasvavas järjekorras. See artikkel ei käsitle multiset. See tegeleb C ++ andmestruktuuriga, mida nimetatakse setiks.

Tarkvaras olev kaart on nagu massiiv, kuid see on massiiv, millel on ühe veeru asemel kaks veergu. Esimeses veerus on võtmed ja teises veerus on väärtused. Iga rida on üks paar, moodustades võtme / väärtuse paari. Võti on otseselt seotud selle väärtusega.

Kaardi näide on 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Esimene siia sisestatud võti / väärtuspaar on 'c', 3, kus 'c' on võti ja 30 on väärtus. Seda kaarti pole klahvide järgi järjestatud. Selle kaardi võtmete järgi järjestamine annab 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Pange tähele, et võib olla dubleeritud väärtusi, kuid mitte dubleeritud võtmeid. Tellitud kaart on kaart, mis on järjestatud klahvide järgi.

Multiset on komplekt, nagu multimap on kaart. See tähendab, et on olemas duplikaatvõtmetega kaarte. Multikaardi näide on 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. Ja nagu eelpool öeldud, ei käsitleta selles artiklis mitmekaarti, pigem käsitletakse C ++ andmestruktuuri nimega map.

C ++ keeles on andmestruktuur omadustega (andmeliikmed) ja meetoditega (liikmefunktsioonid) struktuur. Struktuuri andmed on loetelu; komplekt on loend; kaart on võtme / väärtuse paaride loend.

Selles artiklis käsitletakse C ++ komplektide ja kaartide põhitõdesid ning selle artikli paremaks mõistmiseks oleks pidanud lugejal olema põhiteadmised C++.

Artikli sisu:

Klass ja selle objektid:

C ++ - s nimetatakse komplekti, kaarti ja muid sarnaseid struktuure konteineriteks. Klass on üldistatud üksus koos andmeliikmetega, mis on muutujad, ja liikme funktsioonidega, mis on omavahel seotud. Kui andmeliikmetele antakse väärtused, moodustub objekt. Kuid objekt moodustub protsessis, mida nimetatakse instantsiks. Kuna klass võib viia samade andmeliikme muutujate jaoks erinevate väärtusteni, saab seejärel samast klassist erinevaid objekte instantiseerida.

C ++ keeles on kasutuskõlbmatu komplekt nii klass kui ka kasutamiskõlbmatu kaart. Kui objekt tuvastatakse kasutuskõlbmatust komplektist või kasutamiskõlbmatult kaardilt, saab objekt tõeliseks andmestruktuuriks. Hulgi- ja kaardiandmete struktuuride korral on peamine andmeliige loend. Noh, komplekt ja kaart moodustavad konteinerite rühma, mida nimetatakse tellitud assotsiatiivseteks konteineriteks. Samuti on olemas järjestamata komplekt ja korrastamata kaart, kuid kahjuks neid selles artiklis ei käsitleta.

Komplekti või kaardi loomine:

Hulga instantsimine selle komplektist on hulga loomine; kaardi kiirendamine selle kaardiklassist on kaardi loomine. Nii loodud objektile antakse programmeerija valitud nimi.

Komplekti loomiseks peaks programm algama järgmisega:

# kaasata
# kaasata
nimeruumi kasutamine std;

Pange tähele direktiivi „#include ”, Mis sisaldab komplekti teeki, millel on määratud klass, millest komplekteeritud andmestruktuurid kiirendatakse.

Kaardi loomiseks peaks programm algama järgmisega:

# kaasata
# kaasata
nimeruumi kasutamine std;

Pange tähele direktiivi „#include ”, Mis sisaldab kaardikogu, millel on kaardiklass, kust kaardiandmete struktuurid kiirendatakse.

Tühja komplekti loomise süntaks on järgmine:

seatud objectName

Näide:

seatud setObj;

Sisuga komplekti loomiseks on näiteks:

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

Tühja kaardi loomise süntaks on järgmine:

kaart objectName

Näide:

kaart kaartObj;

Sisukaardi loomiseks on näiteks:

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

Iteraatori põhitõed:

Iteraator on täpsustatud osuti, mida saab kasutada andmestruktuuri loendi algusest lõpuni liikumiseks.

Start () liikme funktsioon

Funktsioon start () tagastab iteraatori, mis osutab loendi esimesele elemendile. Järgmine näide illustreerib seda komplekti kohta:

seatud setObj (6, 10, 2, 8, 4);
seatud:: iteraator iter = setObj.algama ();
cout << *iter << '\n';

Pange tähele, kuidas algust () on kasutatud setObj ja punktioperaatoriga. iter on tagastatud iteraatori objekt. Pange tähele ka selle deklareerimise viisi. * on indirection operaator. Kasutades koos iteriga tagastab see hulga esimese elemendi; esimene element on 6 asemel 2 - vt selgitust allpool.

Järgmine näide illustreerib funktsiooni start () kasutamist kaardil:

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

Pange tähele, kuidas mapObj ja punktoperaatori puhul on algust () kasutatud. iter on tagastatud iteraatori objekt. Pange tähele ka selle deklareerimise viisi. “Esimene” viitab siin kasutatuna võtmele. “Teine” tähistab võtmele vastavat väärtust. Vaadake, kuidas neid on koos iteriga loendi alguselementide komponentide saamiseks kasutatud. Esimene element on c, 30 asemel a, 10 - vt selgitust allpool.

Liikme funktsioon start () const

Funktsioon „begin () const” tagastab iteraatori, mis osutab loendi esimesele elemendile, kui hulga deklaratsioon algab constiga (konstandi jaoks). Selle tingimuse korral ei saa iteraator muuta loendis olevat väärtust, millele viitas tagastatud iteraator. Järgmine näide illustreerib selle kasutamist komplekti jaoks:

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

Pange tähele, kuidas algust () on kasutatud setObj ja punktioperaatoriga. Ühtegi „const” pole kohe pärast algust tippitud (). Deklaratsioonile on aga eelnenud “const”. iter on siin tagastatud konstantse iteraatori objekt, mis erineb tavalisest iteraatorist. Pange tähele ka selle deklareerimise viisi. * on indirection operaator; iteriga kasutamisel tagastab hulga esimese elemendi. Esimene element on 6 asemel 2 - vt selgitust allpool.

Järgmine näide illustreerib kaardi funktsiooni „begin () const” kasutamist:

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

Pange tähele, kuidas mapObj ja punktoperaatori puhul on algust () kasutatud. Ühtegi „const” pole kohe pärast algust tippitud (). Deklaratsioonile on aga eelnenud “const”. iter on siin tagastatud konstantse iteraatori objekt, mis erineb tavalisest iteraatorist. Pange tähele ka selle deklareerimise viisi. "Esimene" viitab siin kasutatuna võtmele; Siin kasutatuna tähendab "teine" võtmele vastavat väärtust. Vaadake, kuidas neid on kasutatud iteriga loendi alguselemendi komponentide saamiseks. Esimene element on c, 30 asemel a, 10 - vt selgitust allpool.

Lõppliikme () funktsioon

Funktsioon end () tagastab iteraatori, mis osutab vahetult pärast loendi lõppu. Järgmine näide illustreerib seda komplekti kohta:

seatud setObj (6, 10, 2, 8, 4);
seatud:: iteraator iter = setObj.lõpp();
cout << *iter << '\n';

Pange tähele, kuidas lõppu () on kasutatud setObj ja punktioperaatoriga. iter on tagastatud iteraatori objekt. Pange tähele ka selle deklareerimise viisi. * on indirection operaator; iteriga kasutamisel tagastab hulga viimase + 1 elemendi. Autori arvutis on see viimane + 1 element 5, mida loendis pole. Niisiis, ärge kasutage seda elementi.

Järgmine näide illustreerib funktsiooni end () kasutamist kaardil:

kaart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kaart:: iteraator iter = mapObj.lõpp();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Pange tähele, kuidas lõppu () on kasutatud mapObj ja punktioperaatoriga. iter on tagastatud iteraatori objekt. Pange tähele ka selle deklareerimise viisi. * on indirection operaator; iteriga kasutamisel tagastab kaardi viimase elemendi + 1. Autori arvutis on see viimane + 1 element , 0, mida loendis pole. Niisiis, ärge kasutage seda elementi.

Liikme „end () const” funktsioon

Funktsioon “end () const” tagastab iteraatori, mis osutab vahetult pärast loendi lõppu, kui hulga deklaratsioon algab constiga (konstandi jaoks). Selle tingimuse korral ei saa iteraator muuta loendis olevat väärtust, millele viitas tagastatud iteraator. Järgmine näide illustreerib selle kasutamist komplekti jaoks:

const seatud setObj (6, 10, 2, 8, 4);
seatud:: const_iterator iter = setObj.lõpp();
cout << *iter << '\n';

Pange tähele, kuidas lõppu () on kasutatud setObj ja punktioperaatoriga. Ühtegi „const” pole pärast lõppu tippitud (). Deklaratsioonile on aga eelnenud “const”. iter on tagastatud iteraatori objekt. Pange tähele ka selle deklareerimise viisi. * on indirection operaator; iteriga kasutamisel tagastab hulga viimase + 1 elemendi.

Järgmine näide illustreerib funktsiooni “end () const” kasutamist kaardil:

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

Pange tähele, kuidas end () on kasutatud mapObj ja punktioperaatoriga. Ühtegi „const” pole pärast lõppu tippitud (). Deklaratsioonile on aga eelnenud “const”. iter on tagastatud konstantse iteraatori objekt, mis erineb tavalisest iteraatorist. Samuti jälgige hoolikalt, kuidas see on deklareeritud.

Elementide juurdepääs komplektile ja kaardile:

Määra

Komplektis loetakse elementi suunamisoperaatori abil. Komplekti kahte esimest elementi loetakse järgmises näites:

seatud setObj (6, 10, 2, 8, 4);
seatud:: iteraator iter = setObj.algama ();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Väljundiks on 2, seejärel järgneb 4 - vt selgitust allpool. Loendi järgmisele elemendile osutamiseks suurendatakse iteraatorit.

Märkus. Elementi ei saa muuta komplekti indirection-operaatori abil. Näiteks „* iter = 9;” ei ole võimalik.

kaart

Kaart koosneb võtme / väärtuse paaridest. Väärtust saab lugeda vastava klahvi abil ja muuta sama klahvi abil. Järgmine koodilõik illustreerib seda:

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

Väljund on:

20
55

Punktioperaatorit pole siin kasutatud. Selle asemel on kasutatud nurksulgude operaatorit, kes võtab võtme sisuks.

Elementide järjestus komplektis või kaardil:

Elemente saab komplekti sisestada mis tahes järjekorras. Kui aga see on sisestatud, korraldab komplekt oma elemendid järjest kasvavas järjestuses. Kasvav järjestus on vaikimisi järjestus. Kui on vaja kahanevat järjestust, tuleb komplekt deklareerida järgmises näites:

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

Niisiis, pärast tüüpi, e.g., int, malli jaoks on koma, millele järgneb „suurem”Nurksulgudes.

Elemente saab kaardile sisestada suvalises järjekorras. Kui kaart on aga sisestatud, korraldab see oma elemendid järjest ainult klahvide kaupa kasvavas järjestuses, säilitades samas suhte iga klahvi ja selle väärtuse vahel. Kasvav järjestus on vaikimisi järjestus; kui on vaja kahanevat järjestust, tuleb kaart deklareerida järgmises näites:

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

Niisiis, pärast tüübipaari e.g., „Char, int”, malli jaoks on koma, millele järgneb „suurem”Nurksulgudes.

Komplekti läbimine

Iteraatoriga while-loopi või for-loopi saab kasutada hulga läbimiseks. Järgmine näide kasutab kahes järjestuses konfigureeritud komplekti läbimiseks for-loopi:

seatud > setObj (6, 10, 2, 8, 4);
jaoks (seatud:: iteraator iter = setObj.algama (); iter != setObj.lõpp(); ++ iter)

cout << *iter << ";

Väljund on:

10 8 6 4 2

Kordaja suurendamine osutab sellele järgmise elemendi.

Kaardi läbimine

Iteraatoriga while-loopi või for-loopi saab kasutada kaardi läbimiseks. Järgmises näites kasutatakse kahanevas järjestuses konfigureeritud kaardi läbimiseks for-loopi:

kaart > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
jaoks (kaart:: iteraator iter = mapObj.algama (); iter != kaartObj.lõpp(); ++ iter)

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

Väljund on:

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

Kordaja suurendamine osutab sellele järgmise elemendi. Koodis “esimene” osutab võtmele ja “teine” vastavale väärtusele. Pange tähele, kuidas need väljundi väärtused on saadud.

Muud tavaliselt kasutatavad liikme funktsioonid:

Suurus () Funktsioon

See funktsioon tagastab täisarvu, mis on loendis olevate elementide arv. Näide:

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

Väljund on 5.

Kaardi näide:

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

Väljund on 5.

Funktsioon insert ()

seatud

komplekt ei luba duplikaati. Seega lükatakse kõik sisestatud duplikaadid vaikides tagasi. Komplekti puhul on funktsiooni insert () argumendiks lisatav väärtus. Väärtus on sobitatud asendisse, kus järjestus komplektis jääb tõusvas või kahanevas. Näide:

seatud setObj (6, 10, 2, 8, 4);
setObj.sisestada (6);
setObj.sisestada (9);
setObj.sisestada (12);
jaoks (seatud:: iteraator iter = setObj.algama (); iter != setObj.lõpp(); ++ iter)

cout << *iter << ";

Väljund on:

2 4 6 8 9 10 12

Märkus. Funktsiooni insert () saab kasutada tühja komplekti täitmiseks.

kaart

kaart ei võimalda võtmete kaupa dubleerimist. Niisiis lükatakse kõik sisestatud duplikaadid vaikides tagasi. Kaardi puhul on funktsiooni insert () argumendiks sulgudes võti / väärtus paar. Element paigaldatakse võtmega positsiooni, milles järjestus kaardil jääb tõusvas või kahanevas. Näide:

kaart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kaartObj.sisesta ('e', 80);
kaartObj.sisesta ('f', 50);
kaartObj.sisesta ('g', 60);
jaoks (kaart:: iteraator iter = mapObj.algama (); iter != kaartObj.lõpp(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Väljund on:

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

Märkus. Funktsiooni insert () saab kasutada tühja kaardi täitmiseks.

Funktsioon tühi ()

See funktsioon tagastab true, kui loend on tühi, ja false, kui pole teisiti. Näide:

seatud setObj (6, 10, 2, 8, 4);
bool ret = setObj.tühi();
cout << ret << '\n';

Väljund on vale jaoks 0, mis tähendab, et siin pole komplekt tühi.

Kaardi näide:

kaart mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = kaartObj.tühi();
cout << ret << '\n';

Väljundiks on 0 vale, mis tähendab, et siinne kaart pole tühi.

Kustutusfunktsioon ()

seatud

Mõelge järgmisele koodisegmendile:

seatud setObj (10, 20, 30, 40, 50);
seatud:: iteraator iter = setObj.algama ();
seatud:: iteraator itr = setObj.kustutada (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.kustutada (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Väljund on:

uus suurus: 4
järgmine väärtus: 20
uus suurus: 3
järgmine väärtus: 30

Funktsioon erase () võtab iteraatori, mis osutab argumendina elemendile. Pärast elemendi kustutamist tagastab funktsioon erase () iteraatori, mis osutab järgmisele elemendile.

kaart

Mõelge järgmisele koodisegmendile:

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

Väljund on:

uus suurus: 4
järgmine väärtuspaar: b, 20
uus suurus: 3
järgmine väärtuspaar: c, 30

Funktsioon erase () võtab iteraatori, mis osutab argumendina elemendile. Pärast elemendi kustutamist tagastab funktsioon erase () iteraatori, mis osutab järgmisele elemendile.

Funktsioon selge ()

Funktsioon clear () eemaldab kõik loendi elemendid. Näide:

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

Väljund on 0.

kaardi näide:

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

Väljund on 0.

Järeldus:

C ++ komplektis olev andmestruktuur on struktuur, milles elementide loend salvestatakse vaikimisi kasvavas järjekorras või programmeerija valikul kahanevas järjekorras. Kõik komplekti elemendid on ainulaadsed. Kaardi andmestruktuur C ++ on struktuur, milles loend on võtme / väärtuse paaride räsi, mis on vaikimisi salvestatud võtmete kasvavas järjekorras või programmeerija valikul võtmete kahanevas järjekorras. Ka võtmed on ainulaadsed ja väärtusi võib olla dubleeritud. Kummagi struktuuri peamine andmeliige on loend. Mõlemal struktuuril on liikmefunktsioonid, millest mõnda kasutatakse tavaliselt.

Parimad Oculus App Lab mängud
Kui olete Oculuse peakomplekti omanik, peate olema teadlik külglaadimisest. Kõrvalaadimine on protsess, millega installitakse peakomplekti mitte-poesi...
10 parimat mängu, mida Ubuntu kaudu mängida
Windowsi platvorm on olnud üks mängude domineerivaid platvorme, kuna tohutu protsent mänge areneb täna Windowsi loomupäraseks toetamiseks. Kas keegi s...
5 parimat arkaadmängu Linuxile
Tänapäeval on arvutid tõsised mängimiseks kasutatavad masinad. Kui te ei saa uut rekordit, teate, mida ma mõtlen. Selles postituses saate teada mõnda ...