Struktūros
Struktūros
C++ kalboje yra nemažai bazinių, o visoje standartinėje bibliotekoje - ir gana sudėtingų tipų. Tačiau būna atvejų, kuomet jų nepakanka. Tokiose situacijose galima pasinaudoti struktūromis - C++ kalbos dalimi, leidžiančia apsirašyti savo duomenų struktūras ir jas naudoti kaip bet kurį kitą tipą.
Problema
Tarkime, sprendžiame uždavinį, kuriame mums pateikiamas sąrašas iš N
taškų su tam tikromis koordinatėmis, o mums reikia atrinkti tik tokius taškus, kurių abi koordinatės yra griežtai mažesnės už tam tikrą skaičių C
. Vienas galimas šio uždavinio sprendimas būtų toks:
Uždavinio sprendimas atrodo gan paprastas, tačiau už akies gali užkliūti viena detalė - taškams laikyti mums prireikė dviejų masyvų. Kadangi taškas yra viena esybė (tik sudaryta iš dviejų skaičių poros), norėtųsi ir masyvą turėti vieną, kur kiekvienas elementas aprašytų vieną tašką. Čia į pagalbą ateina struktūros.
Kas yra struktūra
C++ kalba leidžia apsirašyti savus duomenų tipus, vadinamus struktūromis. Aprašymo sintaksė yra tokia:
Kaip matome, kiekviena struktūra yra sudaryta iš narių - kintamųjų arba funkcijų. O pati struktūra - tai tarsi grupė, jungianti tuos narius į vieną esybę. Pavyzdžiui, jau minėtą taško esybę būtų galima aprašyti taip:
Iš šio pavyzdžio matome, kad taškas - tai esybė, turinti du narius - x
ir y
koordinates.
Po to, kai apsirašėme struktūrą, galime ją naudoti kaip bet kokį kitą duomenų tipą. Pavyzdžiui, galime susikurti kintamąjį, kurio tipas yra Taskas
:
Struktūros tipo kintamųjų narių reikšmės galima pasiekti naudojant taško (.
) operatorių. Taigi, jei norime nurodyti, kad taško t
koordinatės yra (4, 6)
, galime parašyti taip:
Lygiai taip pat galime narių reikšmes ir nuskaityti. Pavyzdžiui, jei norėtume šį tašką išvesti į konsolę, galėtume rašyti tokį kodą:
Struktūros nariai gali būti ne tik paprasti kintamieji - ten galima rašyti ir funkcijas. Papildykime savo struktūrą Taskas
pridėdami funkciją bool arLygus(Taskas kitas)
, kuri pasakytų, ar šis taškas yra lygus kažkokiam kitam taškui:
Šią funkciją galima panaudoti taip:
Šis kodo gabaliukas išspausdintų a ir c lygus
, nes taškų a
ir c
koordinatės sutampa.
Uždavinio sprendimas su struktūromis
Išspręskime skyrelio pradžioje nagrinėtą uždavinį pasinaudodami struktūromis. Sprendimo kodas:
Apibendrinimas
Nors daugelį uždavinių įmanoma išspręsti naudojant vien primityvius duomenų tipus, struktūros dažnai palengvina programuotojo darbą. Šiame uždavinyje, kaip matėme, buvo galima išsiversti be struktūrų gana nesunkiai, tačiau jei uždavinį kiek pakeistume - būtų gerokai sunkiau.
Tarkime, kad dabar vėl gauname sąrašą taškų, tačiau dabar juos norime išrikiuoti pagal x
koordinatę, o jei x
koordinatės lygios - pagal y
koordinatę. Šį uždavinį išspręsti be struktūrų būtų tikrai nemažas galvos skausmas, tačiau naudojantis struktūromis jis beveik nesiskiria nuo jau matyto skaičių rikiavimo.
Sprendimo idėja - apsirašyti struktūrą, laikančią taško koordinates ir turinčią funkciją bool arMazesnisUz(Taskas kitas)
, kuri atsakytų, ar šis taškas yra mažesnis už tašką kitas
(palygina pagal x
koordinates, jei jos nelygios, ir pagal y
, jei lygios). Tada, turint tokių taškų masyvą galima nesunkiai tarpusavyje palyginti du taškus, o tai leidžia ir turimą masyvą išrikiuoti.