C++ Massiivide dünaamiline jaotamine näitega
Mis on dünaamiline massiiv?
Dünaamiline massiiv on üsna sarnane tavalise massiiviga, kuid selle suurust saab programmi käitamise ajal muuta. DynamArray elemendid hõivavad külgneva mäluploki.
Kui massiiv on loodud, ei saa selle suurust muuta. Dünaamiline massiiv on aga erinev. Dünaamiline massiiv võib oma suurust laiendada isegi pärast selle täitmist.
Massiivi loomise ajal eraldatakse sellele etteantud mälumaht. Dünaamilise massiivi puhul see nii ei ole, kuna vajaduse korral suurendab see mälumahtu teatud teguri võrra.
Dünaamiliste massiivide toimivust mõjutavad tegurid
Massiivi esialgne suurus ja kasvutegur määravad selle jõudluse. Pange tähele järgmisi punkte:
- Kui massiivil on väike suurus ja väike kasvutegur, jaotab see mälu sagedamini ümber. See vähendab massiivi jõudlust.
- Kui massiivil on suur suurus ja suur kasvutegur, on sellel tohutu hulk kasutamata mälu. Seetõttu võivad suuruse muutmise toimingud võtta kauem aega. See vähendab massiivi jõudlust.
Uus märksõna
In C++, saame uue märksõna abil luua dünaamilise massiivi. Eraldatavate üksuste arv määratakse nurksulgudes. Tüübi nimi peaks sellele eelnema. Vajalik arv esemeid eraldatakse.
Süntaks
Uuel märksõnal on järgmine süntaks:
pointer_variable = new data_type;
Pointer_muutuja on nimi osuti muutuja.
Data_type peab olema kehtiv C++ andmetüüp.
Seejärel tagastab märksõna kursori esimesele üksusele. Pärast dünaamilise massiivi loomist saame selle kustutada märksõna kustutamise abil.
Näide 1:
#include<iostream> using namespace std; int main() { int x, n; cout << "Enter the number of items:" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " items" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You entered: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } return 0; }
Väljund:
Siin on koodi ekraanipilt:
Koodi selgitus:
- Kaasake iostreami päisefail selle kasutamiseks meie programmi funktsioonid.
- Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
- Deklareerige kaks täisarvu muutujat x ja n.
- Printige konsoolile tekst, mis palub kasutajal sisestada muutuja n väärtus.
- Lugege klaviatuurilt kasutaja sisendit ja määrake see muutujale n.
- Deklareerige massiiv nii, et see sisaldab kokku n täisarvu ja määrake see osuti muutujale *arr.
- Printige sõnum, milles palutakse kasutajal sisestada n arv üksusi.
- Kasutage for-tsüklit, et luua tsüklimuutuja x, et korrata kasutaja sisestatud üksusi.
- Lugege kasutaja sisestatud elemente ja salvestage need massiivi arr.
- Keha lõpp silmuse jaoks.
- Printige konsoolile teksti.
- Kasutage tsüklit for, et luua tsüklimuutuja x, et korrata massiivi üksusi.
- Printige välja väärtused, mis sisalduvad konsooli massiivis nimega arr.
- For-silmuse keha lõpp.
- Programm peab pärast edukat lõpetamist tagastama väärtuse.
- Funktsiooni main() keha lõpp.
MÄRKUS. Ülaltoodud näites on kasutajal lubatud käitamisajal määrata massiivi mis tahes suurus. See tähendab, et massiivi suurus määratakse käitusajal.
Dünaamiliselt eraldatud massiivide lähtestamine
Dünaamilise massiivi lähtestamine nulliks on lihtne.
süntaksit:
int *array{ new int[length]{} };
Ülaltoodud süntaksis tähistab pikkus massiivi lisatavate elementide arvu. Kuna peame massiivi lähtestama nulliks, tuleks see tühjaks jätta.
Dünaamilise massiivi saame lähtestada lähtestajate loendi abil. Loome näite, mis seda demonstreerib.
Näide 2:
#include <iostream> using namespace std; int main(void) { int x; int *array{ new int[5]{ 10, 7, 15, 3, 11 } }; cout << "Array elements: " << endl; for (x = 0; x < 5; x++) { cout << array[x] << endl; } return 0; }
Väljund:
Siin on koodi ekraanipilt:
Koodi selgitus:
- Selle funktsioonide kasutamiseks lisage meie programmi iostreami päisefail.
- Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
- Deklareerige täisarvuline muutuja nimega x.
- Deklareerige dünaamiline massiiv nimega massiiv, kasutades lähtestajate loendit. Massiivis on 5 täisarvu elementi. Pange tähele, et me ei ole kasutanud massiivi pikkuse ja lähtestajate loendi vahel operaatorit "=".
- Printige konsoolile teksti. Endl on a C++ märksõna, mis tähendab lõpprida. See viib kursori järgmisele lausele.
- Kasutage massiivi elementide kordamiseks tsüklit for.
- Printige konsoolile massiivi nimega massiiv sisu.
- For-silmuse keha lõpp.
- Programm peab pärast edukat lõpetamist tagastama väärtuse.
- Funktsiooni main() keha lõpp.
Massiivide suuruse muutmine
Dünaamilise massiivi pikkus määratakse jaotamisaja jooksul.
Kuid C++ ei ole sisseehitatud mehhanismi massiivi suuruse muutmiseks, kui see on eraldatud.
Selle väljakutse saate siiski ületada, eraldades dünaamiliselt uue massiivi, kopeerides elemendid üle ja kustutades seejärel vana massiivi.
Märkus: see tehnika on altid vigadele, seega proovige seda vältida.
Massiivide dünaamiline kustutamine
Dünaamiline massiiv tuleks arvuti mälust kustutada, kui selle eesmärk on täidetud. Kustutusavaldus aitab teil seda teha. Vabanenud mäluruumi saab seejärel kasutada teise andmekogumi hoidmiseks. Isegi kui te dünaamilist massiivi arvutimälust ei kustuta, kustutatakse see programmi lõppedes automaatselt.
Märge:
Dünaamilise massiivi arvutimälust kustutamiseks kasutage kustutamise asemel käsku delete[]. [] annab CPU-le korralduse kustutada ühe muutuja asemel mitu muutujat. Dünaamilise massiiviga tegelemisel käsu delete [] asemel kustutamine võib põhjustada probleeme. Selliste probleemide näideteks on mälulekked, andmete riknemine, kokkujooksmised jne.
Näide 3:
#include<iostream> using namespace std; int main() { int x, n; cout << "How many numbers will you type?" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " numbers" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You typed: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } cout << endl; delete [] arr; return 0; }
Väljund:
Siin on koodi ekraanipilt:
Koodi selgitus:
- Selle funktsioonide kasutamiseks lisage meie programmi iostreami päisefail.
- Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
- Deklareerige kaks täisarvulise andmetüübi muutujat x ja n.
- Printige konsoolile teksti. Tekst palub kasutajal märkida sisestatavate numbrite arv.
- Lugege klaviatuurilt kasutaja sisendit. Sisendväärtus määratakse muutujale n.
- Deklareerib kursori muutuja *arr. Massiivi arr reserveerib natuke mälu, et salvestada kokku n täisarvu.
- Printige konsoolile sõnum, mis palub kasutajal sisestada n numbrit.
- Loo for-silmus ja tsüklimuutuja x, et korrata kasutaja sisestatud numbreid.
- Lugege kasutaja sisestatud numbreid ja salvestage need massiivi arr.
- For-silmuse keha lõpp.
- Printige konsoolile teksti.
- Massiivi arr sisu kordamiseks kasutage tsüklit for ja tsüklimuutujat x.
- Printige konsoolil välja massiivi arr väärtused.
- For-silmuse keha lõpp.
- Printige konsoolile tühi rida.
- Vabastage massiivi arr mälu.
- Programm tagastab väärtuse, kui see on edukalt lõpule viidud.
- Funktsiooni main() keha lõpp.
kokkuvõte
- Tavalistel massiividel on kindel suurus. Pärast deklareerimist ei saa te nende suurust muuta.
- Seda tüüpi massiivide puhul määratakse mälu suurus kompileerimise ajal.
- Dünaamilised massiivid on erinevad. Nende suurust saab tööajal muuta.
- Dünaamilistes massiivides määratakse suurus käitusajal.
- Dünaamilised massiivid sisse C++ on deklareeritud uue märksõna abil.
- Dünaamilises massiivis salvestatavate üksuste arvu määramiseks kasutame nurksulgusid.
- Kui massiiv on valmis, saame kustutamisoperaatori abil mälu vabastada.
- Kasutage kustutamisoperaatorit koos []-ga, et vabastada kõigi massiivi elementide mälu.
- Kustutamine ilma []ta vabastab ainult ühe elemendi mälu.
- Suuruse muutmiseks pole sisseehitatud mehhanismi C++ massiivid.
- Massiivi lähtestamiseks loendi lähtestaja abil ei kasuta me operaatorit „=”.