Što je dinamički niz?
Dinamički niz prilično je sličan redovnom nizu, ali njegova se veličina može mijenjati tijekom izvođenja programa. Elementi DynamArray zauzimaju susjedni blok memorije.
Jednom kada je niz stvoren, njegova se veličina ne može mijenjati. Međutim, dinamički niz je drugačiji. Dinamički niz može proširiti svoju veličinu čak i nakon što je ispunjen.
Tijekom stvaranja niza dodjeljuje mu se unaprijed određena količina memorije. To nije slučaj s dinamičkim nizom jer on povećava svoju memoriju za određeni faktor kada postoji potreba.
U ovom tutorijalu za C ++ naučit ćete
- Što je dinamički niz?
- Čimbenici koji utječu na performanse dinamičkih nizova
- Nova ključna riječ
- Inicijalizacija dinamički dodijeljenih nizova
- Promjena veličine nizova
- Dinamičko brisanje nizova
Čimbenici koji utječu na performanse dinamičkih nizova
Početna veličina niza i faktor rasta određuju njegovu izvedbu. Imajte na umu sljedeće točke:
- Ako niz ima malu veličinu i mali faktor rasta, češće će zadržati memoriju za preraspodjelu. To će smanjiti performanse niza.
- Ako niz ima veliku veličinu i velik faktor rasta, imat će ogroman dio neiskorištene memorije. Zbog toga operacije povećanja veličine mogu trajati dulje. To će smanjiti performanse niza.
Nova ključna riječ
U C ++-u možemo stvoriti dinamički niz pomoću nove ključne riječi. Broj stavki koje će se dodijeliti naveden je u paru uglastih zagrada. Naziv tipa trebao bi prethoditi ovome. Dodijelit će se traženi broj predmeta.
Sintaksa:
Nova ključna riječ ima sljedeću sintaksu:
pointer_variable = new data_type;
Pointer_variable je ime varijable pokazivača.
Vrsta podataka mora biti valjana vrsta podataka C ++.
Ključna riječ zatim vraća pokazivač na prvu stavku. Nakon stvaranja dinamičkog polja možemo ga izbrisati pomoću ključne riječi delete.
Primjer 1:
#includeusing 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;}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u naš program da biste koristili njegove funkcije.
- Uključite std prostor imena u naš program kako biste koristili njegove klase bez pozivanja.
- Pozovite glavnu () funkciju. Logiku programa treba dodati unutar tijela funkcije.
- Deklarirajte dvije cjelobrojne varijable x i n.
- Ispišite neki tekst na konzoli od korisnika koji traži da unese vrijednost varijable n.
- Pročitajte korisnički unos s tipkovnice i dodijelite ga varijabli n.
- Deklarirajte niz koji sadrži ukupno n cijelih brojeva i dodijelite ga pokazivačkoj varijabli * arr.
- Ispišite poruku koja od korisnika traži da unese n broj stavki.
- Upotrijebite petlju for da biste stvorili varijablu petlje x za prelazak preko stavki koje je korisnik unio.
- Pročitajte elemente koje je korisnik unio i pohranite ih u polje arr.
- Kraj tijela petlje for.
- Ispišite malo teksta na konzolu.
- Upotrijebite petlju for da biste kreirali varijablu petlje x za prelazak preko stavki niza.
- Ispišite vrijednosti sadržane u polju nazvanom arr na konzoli.
- Kraj tijela petlje for.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela glavne () funkcije.
NAPOMENA: U gornjem primjeru korisnik može navesti bilo koju veličinu niza tijekom vremena izvođenja. To znači da se veličina niza određuje za vrijeme izvođenja .
Inicijalizacija dinamički dodijeljenih nizova
Lako je inicijalizirati dinamički niz na 0.
Sintaksa:
int *array{ new int[length]{} };
U gornjoj sintaksi duljina označava broj elemenata koji se dodaju u niz. Budući da moramo inicijalizirati niz na 0, to treba ostaviti prazno.
Dinamički niz možemo inicijalizirati pomoću popisa inicijalizatora. Stvorimo primjer koji to pokazuje.
Primjer 2:
#includeusing 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;}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u naš program da biste koristili njegove funkcije.
- Uključite std prostor imena u naš program da koristi njegove klase bez poziva.
- Pozovite glavnu () funkciju. Logiku programa treba dodati unutar tijela funkcije.
- Deklarirajte cjelobrojnu varijablu s imenom x.
- Deklarirajte dinamički niz s imenom niz pomoću inicijalizacijskog popisa. Polje će sadržavati 5 cjelobrojnih elemenata. Imajte na umu da nismo koristili operator između duljine niza i popisa inicijalizatora.
- Ispišite malo teksta na konzolu. Endl je ključna riječ C ++ koja znači završni redak. Premješta kursor na sljedeću rečenicu.
- Upotrijebite petlju for za prelazak preko elemenata niza.
- Ispišite sadržaj niza s imenom niz na konzoli.
- Kraj tijela petlje for.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela glavne () funkcije.
Promjena veličine nizova
Duljina dinamičkog polja postavlja se tijekom vremena dodjele.
Međutim, C ++ nema ugrađeni mehanizam za promjenu veličine niza nakon što je dodijeljen.
Međutim, ovaj izazov možete prevladati dinamičkim dodjeljivanjem novog niza, kopiranjem elemenata, a zatim brisanjem starog niza.
Napomena: da je ova tehnika sklona pogreškama, stoga je pokušajte izbjeći.
Dinamičko brisanje nizova
Dinamički niz treba izbrisati iz memorije računala kada se ispuni njegova svrha. Izjava o brisanju može vam pomoći da to postignete. Oslobođeni memorijski prostor tada se može koristiti za čuvanje drugog skupa podataka. Međutim, čak i ako ne izbrišete dinamički niz iz memorije računala, on će se automatski izbrisati nakon završetka programa.
Bilješka:
Da biste izbrisali dinamički niz iz memorije računala, umjesto brisanja upotrijebite delete []. [] Upućuje CPU da izbriše više varijabli, a ne jednu varijablu. Korištenje delete umjesto delete [] kada se radi s dinamičkim nizom može rezultirati problemima. Primjeri takvih problema uključuju curenje memorije, oštećenje podataka, padove itd.
Primjer 3:
#includeusing 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;}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja iostream u naš program kako biste koristili njegove funkcije.
- Uključite std prostor imena u naš program kako biste koristili njegove klase bez pozivanja.
- Pozovite glavnu () funkciju. Logiku programa treba dodati unutar tijela funkcije.
- Deklarirajte dvije varijable x i n cjelobrojnog tipa podataka.
- Ispišite malo teksta na konzolu. U tekstu će se od korisnika tražiti da navede broj brojeva koje će unijeti.
- Pročitajte unos korisnika s tipkovnice. Ulazna vrijednost dodijelit će se varijabli n.
- Proglasite pokazivačku varijablu * arr. Polje arr rezervirat će malo memorije za spremanje ukupno n cijelih brojeva.
- Ispišite poruku na konzoli koja od korisnika traži da unese n brojeva.
- Stvorite for petlju i varijablu petlje x za iteraciju brojeva koje je korisnik unio.
- Pročitajte brojeve koje je korisnik unio i pohranite ih u polje polja.
- Kraj tijela petlje for.
- Ispišite malo teksta na konzolu.
- Upotrijebite petlju for i varijablu petlje x za prelazak kroz sadržaj niza arr.
- Ispišite vrijednosti polja arr na konzoli.
- Kraj tijela petlje for.
- Ispišite prazan redak na konzoli.
- Oslobodite memoriju polja arr.
- Program će vratiti vrijednost kada se uspješno dovrši.
- Kraj tijela glavne () funkcije.
Sažetak:
- Redoviti nizovi imaju fiksnu veličinu. Jednom prijavljenu veličinu ne možete mijenjati.
- Kod ovih vrsta polja veličina memorije određuje se tijekom vremena kompajliranja.
- Dinamički nizovi su različiti. Njihove veličine mogu se mijenjati tijekom izvođenja.
- U dinamičkim nizovima veličina se određuje tijekom izvođenja.
- Dinamički nizovi u C ++-u deklariraju se pomoću nove ključne riječi.
- Upotrebljavamo uglate zagrade za određivanje broja stavki koje će se pohraniti u dinamički niz.
- Nakon što završimo s nizom, možemo osloboditi memoriju pomoću operatora delete.
- Upotrijebite operater delete s [] da oslobodite memoriju svih elemenata niza.
- Brisanje bez [] oslobađa memoriju samo jednog elementa.
- Ne postoji ugrađeni mehanizam za promjenu veličine nizova C ++.
- Da bismo inicijalizirali niz pomoću inicijalizatora popisa, ne koristimo operator .