C ++

Unikalūs ir užsakyti konteineriai C ++

Unikalūs ir užsakyti konteineriai C ++
6, 10, 2, 8, 4 yra rinkinys; 2, 4, 6, 8, 10 yra tų pačių sveikųjų skaičių rinkinys, išdėstytas didėjimo tvarka. Matematikoje aibė turi unikalių elementų (atskirų elementų), tai yra, nė vienas elementas neatsiranda daugiau nei vieną kartą. Be to, „multiset“ yra rinkinys, kuriame bet kuris elementas gali atsirasti daugiau nei vieną kartą. 6, 6, 10, 2, 2, 8, 4, 4, 4 yra daugialypė. 2, 2, 4, 4, 4, 6, 6, 8, 10 yra tas pats daugialypis elementas, tačiau elementai išdėstyti didėjimo tvarka. Šis straipsnis nenagrinėjamas daugialypis ryšys. Jame nagrinėjama C ++ duomenų struktūra, vadinama rinkiniu.

Žemėlapis programinėje įrangoje yra kaip masyvas, tačiau tai yra masyvas, kuriame yra du stulpeliai, o ne vienas. Pirmame stulpelyje yra raktai, o antrame - vertės. Kiekviena eilutė yra viena pora, sudaranti raktų / reikšmių porą. Raktas yra tiesiogiai susijęs su jo verte.

Žemėlapio pavyzdys yra 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Pirmoji čia įterpta raktų / reikšmių pora yra 'c', 3, kur 'c' yra raktas, o 30 - vertė. Šis žemėlapis nėra užsakomas klavišais. Užsakius šį žemėlapį klavišais, gaunami 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Atkreipkite dėmesį, kad gali būti pasikartojančios vertės, bet ne pasikartojantys raktai. Užsakytas žemėlapis yra žemėlapis, išdėstytas klavišais.

Daugialypė yra rinkinys, kaip daugialypė žemėlapis. Tai reiškia, kad yra žemėlapių su pasikartojančiais raktais. Daugkartinės žemėlapio pavyzdys yra 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. Kaip minėta aukščiau, šiame straipsnyje kalbama ne apie daugialypę žemėlapį, o apie C ++ duomenų struktūrą, vadinamą „map“.

C ++ duomenų struktūra yra struktūra su savybėmis (duomenų nariai) ir metodais (narių funkcijos). Struktūros duomenys yra sąrašas; aibė yra sąrašas; žemėlapis yra raktų / reikšmių porų sąrašas.

Šiame straipsnyje aptariami C ++ rinkinių ir žemėlapių pagrindai, o norint geriau suprasti šį straipsnį, skaitytojas turėjo turėti pagrindinių žinių apie C++.

Straipsnio turinys:

Klasė ir jos objektai:

C ++ rinkinys, žemėlapis ir kitos panašios struktūros vadinamos konteineriais. Klasė yra apibendrintas vienetas, kuriame yra duomenų nariai, kurie yra kintamieji, ir narių funkcijos, kurios yra susijusios. Kai duomenų nariams suteikiamos reikšmės, susidaro objektas. Tačiau objektas susiformuoja procese, kuris vadinamas momentiniu. Kadangi klasė gali lemti skirtingas tų pačių duomenų narių kintamųjų reikšmes, tada iš tos pačios klasės galima iš karto nustatyti skirtingus objektus.

C ++ versijoje nenaudojamas rinkinys yra klasė, taip pat nenaudojamas žemėlapis. Kai objektas iš karto gaunamas iš netinkamo naudoti rinkinio ar netinkamo žemėlapio, objektas tampa tikra duomenų struktūra. Naudojant rinkinio ir žemėlapio duomenų struktūras, pagrindinis duomenų narys yra sąrašas. Na, rinkinys ir žemėlapis sudaro konteinerių grupę, vadinamą, užsakytą asociaciją. Taip pat egzistuoja nesutvarkytas rinkinys ir nesutvarkytas žemėlapis, tačiau šiame straipsnyje jie, deja, nėra nagrinėjami.

Rinkinio ar žemėlapio kūrimas:

Intuituojant rinkinį iš jo rinkinio klasės, sukuriamas rinkinys; greitinti žemėlapį iš jo žemėlapių klasės, sukuriamas žemėlapis. Taip sukurtam objektui suteikiamas programuotojo pasirinktas pavadinimas.

Norint sukurti rinkinį, programa turėtų prasidėti taip:

# įtraukti
# įtraukti
naudojant vardų sritį std;

Atkreipkite dėmesį į direktyvą „#include “, Į kurią įeina nustatyta biblioteka, turinti nustatytą klasę, iš kurios bus sukurtos rinkinio duomenų struktūros.

Norėdami sukurti žemėlapį, programa turėtų prasidėti taip:

# įtraukti
# įtraukti
naudojant vardų sritį std;

Atkreipkite dėmesį į direktyvą „#include “, Į kurią įeina žemėlapių biblioteka, turinti žemėlapių klasę, iš kurios bus sukurtos žemėlapio duomenų struktūros.

Sintaksė tuščiam rinkiniui sukurti yra:

rinkinys objectName

Pavyzdys:

rinkinys setObj;

Rinkinio su turiniu kūrimo pavyzdys yra:

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

Sintaksė norint sukurti tuščią žemėlapį yra:

žemėlapis objectName

Pavyzdys:

žemėlapis mapObj;

Žemėlapio su turiniu kūrimo pavyzdys yra:

žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Iteratoriaus pagrindai:

Iteratorius yra parengtas rodyklė, kuria galima pereiti duomenų struktūros sąrašą nuo pradžios iki pabaigos.

Pradžios () nario funkcija

„Member“ (funkcija) grąžina iteratorių, kuris nurodo pirmąjį sąrašo elementą. Šis rinkinio pavyzdys tai iliustruoja:

rinkinys setObj (6, 10, 2, 8, 4);
rinkinys:: iteratorius iter = setObj.pradėti ();
cout << *iter << '\n';

Atkreipkite dėmesį, kaip pradžia () buvo naudojama su „setObj“ ir taško operatoriumi. iter yra grąžintas iteratoriaus objektas. Taip pat atkreipkite dėmesį į tai, kaip jis buvo deklaruotas. * yra netiesioginis operatorius. Naudojant „iter“, jis pateikia pirmąjį rinkinio elementą; pirmasis elementas yra 2, o ne 6 - žr. paaiškinimą žemiau.

Šis pavyzdys iliustruoja funkcijos start () naudojimą žemėlapiui:

žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
žemėlapis:: iteratorius iter = mapObj.pradėti ();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Atkreipkite dėmesį, kaip pradžia () buvo naudojama su mapObj ir taškų operatoriumi. iter yra grąžintas iteratoriaus objektas. Taip pat atkreipkite dėmesį į tai, kaip jis buvo deklaruotas. „Pirmasis“, kaip čia vartojamas, reiškia raktą. „Antra“ reiškia reikšmę, atitinkančią raktą. Stebėkite, kaip jie buvo naudojami su iter, norint gauti sąrašo pradinių elementų komponentus. Pirmasis elementas yra a, 10, o ne c, 30 - žr. Paaiškinimą žemiau.

„Start () const“ nario funkcija

„Start () const“ nario funkcija grąžina iteratorių, kuris nurodo pirmąjį sąrašo elementą, kai aibės deklaracija prasideda konst (konstanta). Esant tokiai sąlygai, iteratorius negali pakeisti grąžintos iteratoriaus nurodytos sąrašo vertės. Šis pavyzdys iliustruoja jo naudojimą rinkiniui:

konst setObj (6, 10, 2, 8, 4);
rinkinys:: const_iterator iter = setObj.pradėti ();
cout << *iter << '\n';

Atkreipkite dėmesį, kaip pradžia () buvo naudojama su „setObj“ ir taško operatoriumi. Nėra „const“ įvesta iškart po pradžios (). Tačiau prieš deklaravimą buvo „const“. iter čia yra grąžintas pastovaus iteratoriaus objektas, kuris skiriasi nuo įprasto iteratoriaus. Taip pat atkreipkite dėmesį į tai, kaip jis buvo deklaruotas. * yra netiesioginis operatorius; kaip naudojamas kartu su iter, jis grąžina pirmąjį rinkinio elementą. Pirmasis elementas yra 2, o ne 6 - žr. Paaiškinimą žemiau.

Šis pavyzdys iliustruoja funkcijos „begin () const“ naudojimą žemėlapyje:

konst žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
žemėlapis:: const_iterator iter = mapObj.pradėti ();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Atkreipkite dėmesį, kaip pradžia () buvo naudojama su mapObj ir taškų operatoriumi. Nėra „const“ įvesta iškart po pradžios (). Tačiau prieš deklaravimą buvo „const“. iter čia yra grąžintas pastovaus iteratoriaus objektas, kuris skiriasi nuo įprasto iteratoriaus. Be to, atkreipkite dėmesį į tai, kaip jis buvo deklaruotas. „Pirmasis“, kaip čia vartojamas, reiškia raktą; „Antrasis“, kaip čia vartojama, reiškia raktą atitinkančią vertę. Stebėkite, kaip jie buvo naudojami su iter, norint gauti sąrašo pradinių elementų komponentus. Pirmasis elementas yra a, 10, o ne c, 30 - žr. Paaiškinimą žemiau.

Galutinio () nario funkcija

Funkcija end () grąžina iteratorių, nurodantį iškart po sąrašo pabaigos. Šis rinkinio pavyzdys tai iliustruoja:

rinkinys setObj (6, 10, 2, 8, 4);
rinkinys:: iteratorius iter = setObj.galas();
cout << *iter << '\n';

Atkreipkite dėmesį, kaip „end“ () buvo naudojamas su „setObj“ ir taško operatoriumi. iter yra grąžintas iteratoriaus objektas. Taip pat atkreipkite dėmesį į tai, kaip jis buvo deklaruotas. * yra netiesioginis operatorius; kaip naudojamas su iter, jis grąžina paskutinį + 1 rinkinio elementą. Autoriaus kompiuteryje šis paskutinis + 1 elementas yra 5, kurio nėra sąraše. Taigi, atsargiai nenaudokite šio elemento.

Šis pavyzdys iliustruoja funkcijos end () naudojimą žemėlapiui:

žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
žemėlapis:: iteratorius iter = mapObj.galas();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Atkreipkite dėmesį, kaip end () buvo naudojamas su mapObj ir taškų operatoriumi. iter yra grąžintas iteratoriaus objektas. Taip pat atkreipkite dėmesį į tai, kaip jis buvo deklaruotas. * yra netiesioginis operatorius; naudojant „iter“, jis pateikia paskutinį + 1 žemėlapio elementą. Autoriaus kompiuteryje šis paskutinis + 1 elementas yra , 0, kurio nėra sąraše. Taigi, atsargiai nenaudokite šio elemento.

„End () const“ nario funkcija

„End () const“ nario funkcija pateikia iteratorių, kuris nurodo iškart po sąrašo pabaigos, kai aibės deklaracija prasideda konst (konstanta). Esant tokiai sąlygai, iteratorius negali pakeisti grąžintos iteratoriaus nurodytos sąrašo vertės. Šis pavyzdys iliustruoja jo naudojimą rinkiniui:

konst setObj (6, 10, 2, 8, 4);
rinkinys:: const_iterator iter = setObj.galas();
cout << *iter << '\n';

Atkreipkite dėmesį, kaip „end“ () buvo naudojamas su „setObj“ ir taško operatoriumi. Nėra „const“ įvesta iškart po pabaigos (). Tačiau prieš deklaravimą buvo „const“. iter yra grąžintas iteratoriaus objektas. Taip pat atkreipkite dėmesį į tai, kaip jis buvo deklaruotas. * yra netiesioginis operatorius; kaip naudojamas su iter, jis grąžina paskutinį + 1 rinkinio elementą.

Šis pavyzdys iliustruoja funkcijos „end () const“ naudojimą žemėlapyje:

konst žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
žemėlapis:: const_iterator iter = mapObj.galas();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Atkreipkite dėmesį, kaip end () buvo naudojamas su mapObj ir taškų operatoriumi. Nėra „const“ įvesta iškart po pabaigos (). Tačiau prieš deklaravimą buvo „const“. iter yra grąžintas pastovaus iteratoriaus objektas, kuris skiriasi nuo įprasto iteratoriaus. Be to, atidžiai stebėkite, kaip jis buvo deklaruotas.

Elemento prieiga rinkiniui ir žemėlapiui:

Nustatyti

Naudojant rinkinį, elementas nuskaitomas naudojant nukreipimo operatorių. Pirmieji du rinkinio elementai skaitomi šiame pavyzdyje:

rinkinys setObj (6, 10, 2, 8, 4);
rinkinys:: iteratorius iter = setObj.pradėti ();
cout << *iter << '\n';
++kartoti;
cout << *iter << '\n';

Išvestis yra 2, po to seka 4 - žr. Paaiškinimą žemiau. Norėdami nukreipti į kitą sąrašo elementą, iteratorius yra padidinamas.

Pastaba: Elemento negalima pakeisti naudojant rinkinio indirection operatorių. Pvz., „* Iter = 9;“ neįmanoma.

žemėlapis

Žemėlapį sudaro raktų / reikšmių poros. Vertę galima nuskaityti naudojant atitinkamą raktą ir pakeisti tuo pačiu raktu. Tai iliustruoja šis kodo segmentas:

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

Rezultatas yra:

20
55

Taškų operatorius čia nenaudotas. Vietoj to, naudojamas laužtinių skliaustų operatorius, kuris raktą laiko turiniu.

Elementų tvarka rinkinyje ar žemėlapyje:

Elementai gali būti įterpiami į rinkinį bet kokia tvarka. Tačiau įdėjęs rinkinys elementus pertvarko didėjimo tvarka. Didėjimo tvarka yra numatytoji tvarka. Jei reikalinga mažėjimo tvarka, rinkinys turi būti deklaruojamas taip, kaip šiame pavyzdyje:

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

Taigi, po tipo, el.g., int, šablonui yra kablelis, po kurio rašoma „didesnis“Kampiniuose skliaustuose.

Elementus į žemėlapį galima įterpti bet kokia tvarka. Tačiau įterptas žemėlapis pertvarko elementus didėjančia tvarka pagal raktą (tik) išlaikydamas santykį tarp kiekvieno rakto ir jo vertės. Didėjimo tvarka yra numatytoji tvarka; jei reikia mažėjimo tvarka, žemėlapį reikia deklaruoti taip, kaip parodyta šiame pavyzdyje:

žemėlapis > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Taigi, po tipo poros, el.g., „Char, int“, šablonui yra kablelis, po kurio rašoma „didesnis“Kampiniuose skliaustuose.

Kelionė rinkinį

„While-loop“ arba „for-loop“ su iteratoriumi gali būti naudojami norint pereiti rinkinį. Šiame pavyzdyje „for-loop“ naudojamas norint rinkti rinkinį, sukonfigūruotą mažėjančia tvarka:

rinkinys > setObj (6, 10, 2, 8, 4);
už (rinkinys:: iteratorius iter = setObj.pradėti (); iteruoti != setObj.galas(); ++ iter)

cout << *iter << ";

Rezultatas yra:

10 8 6 4 2

Padidinus iteratorių, jis nukreipiamas į kitą elementą.

Kelionė žemėlapiu

Kartu arba „for-loop“ su iteratoriumi galima naudoti žemėlapį. Šiame pavyzdyje naudojamas „for-loop“ žemėlapis, sukonfigūruotas mažėjančia tvarka:

žemėlapis > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
už (žemėlapis:: iteratorius iter = mapObj.pradėti (); iteruoti != mapObj.galas(); ++ iter)

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

Rezultatas yra:

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

Padidinus iteratorių, jis nukreipiamas į kitą elementą. „Pirmasis“ kode reiškia raktą, o „antrasis“ - atitinkamą vertę. Atkreipkite dėmesį, kaip buvo gautos šios išvesties vertės.

Kitos dažniausiai naudojamos narių funkcijos:

Funkcija dydis ()

Ši funkcija grąžina sveiką skaičių, kuris yra elementų skaičius sąraše. Nustatykite pavyzdį:

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

Išvestis yra 5.

Žemėlapio pavyzdys:

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

Išvestis yra 5.

Įterpimo () funkcija

rinkinys

rinkinys neleidžia dublikato. Taigi, bet koks įdėtas dublikatas tyliai atmetamas. Naudojant rinkinį, funkcijos (()) argumentas yra vertė, kurią reikia įterpti. Vertė pritaikoma padėčiai, kurioje rinkinio tvarka lieka didėjančia ar mažėjančia. Pavyzdys:

rinkinys setObj (6, 10, 2, 8, 4);
setObj.įdėklas (6);
setObj.įdėklas (9);
setObj.įdėklas (12);
už (rinkinys:: iteratorius iter = setObj.pradėti (); iteruoti != setObj.galas(); ++ iter)

cout << *iter << ";

Rezultatas yra:

2 4 6 8 9 10 12

Pastaba: „Insert“) funkcija gali būti naudojama tuščiam rinkiniui užpildyti.

žemėlapis

žemėlapis neleidžia kopijuoti pagal raktą. Taigi, bet koks įdėtas dublikatas tyliai atmetamas. Naudojant žemėlapį, funkcijos insert () argumentas yra breketų raktų / reikšmių pora. Elementas pritaikomas klavišo padėčiai, kurioje tvarka žemėlapyje lieka didėjančia ar mažėjančia. Pavyzdys:

žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
žemėlapis Obj.įterpti ('e', 80);
žemėlapis Obj.įterpti ('f', 50);
žemėlapis Obj.įterpti ('g', 60);
už (žemėlapis:: iteratorius iter = mapObj.pradėti (); iteruoti != mapObj.galas(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Rezultatas yra:

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

Pastaba: nario (insert) funkciją galima naudoti tuščiam žemėlapiui užpildyti.

Funkcija tuščia ()

Ši funkcija grąžinama, jei sąrašas tuščias, ir klaidinga, jei kitaip. Nustatykite pavyzdį:

rinkinys setObj (6, 10, 2, 8, 4);
bool ret = setObj.tuščia();
cout << ret << '\n';

Išvestis yra 0, jei klaidinga, tai reiškia, kad rinkinys nėra tuščias.

Žemėlapio pavyzdys:

žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.tuščia();
cout << ret << '\n';

Išvestis yra 0, jei klaidinga, o tai reiškia, kad žemėlapis čia nėra tuščias.

Ištrynimo () funkcija

rinkinys

Apsvarstykite šį kodo segmentą:

rinkinys setObj (10, 20, 30, 40, 50);
rinkinys:: iteratorius iter = setObj.pradėti ();
rinkinys:: iteratorius itr = setObj.ištrinti (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.ištrinti (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Rezultatas yra:

naujas dydis: 4
kita vertė: 20
naujas dydis: 3
kita vertė: 30

Funkcija „erase ()“ reikalauja iteratoriaus, kuris nurodo elementą kaip argumentą. Ištrynus elementą, funkcija erase () grąžina iteratorių, kuris nurodo kitą elementą.

žemėlapis

Apsvarstykite šį kodo segmentą:

žemėlapis mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
žemėlapis:: iteratorius iter = mapObj.pradėti ();
žemėlapis:: iteratorius itr = mapObj.ištrinti (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.ištrinti (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Rezultatas yra:

naujas dydis: 4
kita reikšmių pora: b, 20
naujas dydis: 3
kita reikšmių pora: c, 30

Funkcija „erase ()“ reikalauja iteratoriaus, kuris nurodo elementą kaip argumentą. Ištrynus elementą, funkcija erase () grąžina iteratorių, kuris nurodo kitą elementą.

Funkcija aiški ()

Funkcija clear () pašalina visus sąrašo elementus. Nustatykite pavyzdį:

rinkinys setObj (6, 10, 2, 8, 4);
setObj.aišku ();
cout << setObj.size() << '\n';

Išėjimas yra 0.

žemėlapio pavyzdys:

žemėlapis mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
žemėlapis Obj.aišku ();
cout << mapObj.size() << '\n';

Išėjimas yra 0.

Išvada:

Nustatyta duomenų struktūra C ++ yra struktūra, kurioje elementų sąrašas saugomas didėjimo tvarka pagal numatytuosius nustatymus arba mažėjančia tvarka pagal programuotojo pasirinkimą. Visi rinkinio elementai yra unikalūs. Žemėlapio duomenų struktūra C ++ yra struktūra, kurioje sąrašas yra raktų / reikšmių porų maišos, pagal numatytuosius nustatymus saugomos raktų didėjimo tvarka arba mažėjančia raktų tvarka pagal programuotojo pasirinkimą. Raktai taip pat yra unikalūs ir gali būti dubliuojamos vertės. Pagrindinis bet kurios iš struktūrų duomenų narys yra sąrašas. Bet kuri struktūra turi narių funkcijas, kai kurios iš jų dažniausiai naudojamos.

Kaip rodyti OSD perdangą viso ekrano „Linux“ programose ir žaidimuose
Žaisdami viso ekrano žaidimus arba naudodamiesi programomis be išsiblaškymo viso ekrano režimu, galite nutraukti nuo susijusios sistemos informacijos,...
5 geriausios žaidimų fiksavimo kortos
Visi mes matėme ir pamėgome srautinius žaidimus „YouTube“. „PewDiePie“, „Jakesepticye“ ir „Markiplier“ yra tik vieni iš geriausių žaidėjų, kurie uždir...
Kaip sukurti žaidimą „Linux“
Prieš dešimtmetį nedaugelis „Linux“ vartotojų numatė, kad jų mėgstama operacinė sistema vieną dieną bus populiari komercinių vaizdo žaidimų žaidimų pl...