C++ Dinamička dodjela nizova s primjerom
Što je dinamički niz?
Dinamički niz prilično je sličan običnom nizu, ali se njegova veličina može mijenjati tijekom izvođenja programa. Elementi DynamArray zauzimaju kontinuirani blok memorije.
Nakon što je polje kreirano, njegova se veličina ne može promijeniti. Međutim, dinamički niz je drugačiji. Dinamički niz može proširiti svoju veličinu čak i nakon što je popunjen.
Tijekom stvaranja polja, njemu se dodjeljuje unaprijed određena količina memorije. To nije slučaj s dinamičkim poljem jer ono povećava svoju veličinu memorije za određeni faktor kada postoji potreba.
Čimbenici koji utječu na performanse dinamičkih polja
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, nastavit će češće preraspodijeliti memoriju. To će smanjiti performanse niza.
- Ako niz ima veliku veličinu i veliki faktor rasta, imat će ogroman dio neiskorištene memorije. Zbog toga operacije promjene veličine mogu trajati dulje. To će smanjiti performanse niza.
Nova ključna riječ
In C++, možemo stvoriti dinamički niz koristeći novu ključnu riječ. Broj stavki koje treba dodijeliti naveden je u paru uglatih zagrada. Naziv tipa trebao bi prethoditi ovome. Zatraženi broj stavki bit će dodijeljen.
Sintaksa
Nova ključna riječ ima sljedeću sintaksu:
pointer_variable = new data_type;
Pointer_varijabla je naziv za pokazivačka varijabla.
Data_type mora biti valjan C++ vrsta podataka.
Ključna riječ tada vraća pokazivač na prvu stavku. Nakon što stvorimo dinamički niz, možemo ga izbrisati pomoću ključne riječi delete.
Primjer 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; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u naš program da biste je koristili Funkcije.
- Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela funkcije.
- Deklarirajte dvije cjelobrojne varijable x i n.
- Ispišite neki tekst na konzoli tražeći od korisnika da unese vrijednost varijable n.
- Čitanje korisničkog unosa s tipkovnice i njegovo dodjeljivanje varijabli n.
- Deklarirajte niz da sadrži ukupno n cijelih brojeva i dodijelite ga varijabli pokazivača *arr.
- Ispišite poruku koja od korisnika traži da unese n broj stavki.
- Upotrijebite for petlju za stvaranje varijable petlje x za ponavljanje preko stavki koje je unio korisnik.
- Čitanje elemenata koje je unio korisnik i njihovo pohranjivanje u polje arr.
- Kraj tijela za petlju.
- Ispišite tekst na konzoli.
- Upotrijebite for petlju za stvaranje varijable petlje x za ponavljanje preko stavki niza.
- Ispišite vrijednosti sadržane u polju pod nazivom arr na konzoli.
- Kraj tijela for petlje.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela funkcije main().
NAPOMENA: U gornjem primjeru, korisniku je dopušteno navesti bilo koju veličinu za niz tijekom vremena izvođenja. To znači da se veličina niza određuje tijekom izvođenja.
Inicijaliziranje 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 polje. Budući da moramo inicijalizirati niz na 0, ovo treba ostaviti prazno.
Dinamičko polje možemo inicijalizirati pomoću popisa inicijalizatora. Kreirajmo primjer koji to pokazuje.
Primjer 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; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja iostream u naš program da biste koristili njegove funkcije.
- Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela funkcije.
- Deklarirajte cjelobrojnu varijablu imena x.
- Deklarirajte dinamičko polje pod nazivom array koristeći popis inicijalizatora. Niz će sadržavati 5 cjelobrojnih elemenata. Imajte na umu da nismo upotrijebili operator “=” između duljine polja i popisa inicijalizatora.
- Ispišite tekst na konzoli. Kraj je a C++ ključna riječ koja znači završni redak. Pomiče kursor na sljedeću rečenicu.
- Koristite for petlju za ponavljanje preko elemenata niza.
- Ispišite sadržaj niza pod nazivom array na konzoli.
- Kraj tijela for petlje.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela funkcije main().
Promjena veličine polja
Duljina dinamičkog niza postavlja se tijekom vremena dodjele.
Međutim, C++ nema ugrađeni mehanizam za promjenu veličine niza nakon što je dodijeljen.
Međutim, možete prevladati ovaj izazov dinamičkim dodjeljivanjem novog niza, kopiranjem preko elemenata, a zatim brisanjem starog niza.
Napomena: ova tehnika je sklona pogreškama, stoga je pokušajte izbjeći.
Dinamičko brisanje nizova
Dinamički niz treba obrisati iz memorije računala nakon što ispuni svoju svrhu. Izjava brisanja može vam pomoći da to postignete. Oslobođeni memorijski prostor tada se može koristiti za držanje drugog skupa podataka. Međutim, čak i ako ne izbrišete dinamički niz iz memorije računala, on će se automatski izbrisati kada program završi.
Bilješka:
Za brisanje dinamičkog niza iz memorije računala, trebali biste koristiti delete[], umjesto delete. [] upućuje CPU da izbriše više varijabli umjesto jedne varijable. Upotreba 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:
#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; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja iostream u naš program kako biste koristili njegove funkcije.
- Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela funkcije.
- Deklarirajte dvije varijable x i n tipa podataka integer.
- Ispišite tekst na konzoli. U tekstu će se od korisnika tražiti da navede broj brojeva koje će unijeti.
- Čitanje korisničkog unosa s tipkovnice. Ulazna vrijednost bit će dodijeljena varijabli n.
- Deklarirajte pokazivačku varijablu *arr. Niz arr će rezervirati nešto memorije za pohranjivanje ukupno n cijelih brojeva.
- Ispišite poruku na konzoli koja od korisnika traži da unese n brojeva.
- Napravite for petlju i varijablu petlje x za ponavljanje preko brojeva koje je unio korisnik.
- Čitanje brojeva koje je unio korisnik i njihovo pohranjivanje u polje arr.
- Kraj tijela for petlje.
- Ispišite tekst na konzoli.
- Upotrijebite for petlju i varijablu petlje x za ponavljanje sadržaja niza arr.
- Ispišite vrijednosti niza arr na konzoli.
- Kraj tijela for petlje.
- Ispišite prazan redak na konzoli.
- Oslobodite memoriju niza arr.
- Program će vratiti vrijednost kada uspješno završi.
- Kraj tijela funkcije main().
Rezime
- Regularni nizovi imaju fiksnu veličinu. Ne možete mijenjati njihovu veličinu nakon deklaracije.
- Kod ovih vrsta nizova, veličina memorije se određuje tijekom vremena prevođenja.
- Dinamički nizovi su različiti. Njihove se veličine mogu mijenjati tijekom rada.
- U dinamičkim nizovima, veličina se određuje tijekom izvođenja.
- Dinamički nizovi u C++ deklariraju se pomoću nove ključne riječi.
- Koristimo uglate zagrade da odredimo broj stavki koje će biti pohranjene u dinamičkom nizu.
- Kada završimo s nizom, možemo osloboditi memoriju pomoću operatora za brisanje.
- Koristite operator za brisanje s [] da biste oslobodili memoriju svih elemenata niza.
- Brisanje bez [] oslobađa memoriju samo jednog elementa.
- Ne postoji ugrađeni mehanizam za promjenu veličine C++ nizovi.
- Za inicijalizaciju niza pomoću inicijalizatora popisa, ne koristimo operator “=”.