C++ Dynaaminen taulukoiden allokointi esimerkin avulla
โก รlykรคs yhteenveto
C++ Dynaaminen allokointi matriiseissa selittรครค, miten keossa olevia matriiseja allokoidaan, muutetaan ja poistetaan ajonaikana. LessOngelmat kattavat uuden luonnin, poiston[], alustuksen, kopioinnin, koon muuttamisen ja turvallisen muistin mallit.

Mikรค on dynaaminen array?
Dynaaminen taulukko on melko samanlainen kuin tavallinen taulukko, mutta sen kokoa voidaan muuttaa ohjelman ajon aikana. DynamArray-elementit vievรคt jatkuvan muistilohkon.
Kun taulukko on luotu, sen kokoa ei voi muuttaa. Dynaaminen matriisi on kuitenkin erilainen. Dynaaminen matriisi voi laajentaa kokoaan senkin jรคlkeen, kun se on tรคytetty.
Taulukon luomisen aikana sille varataan ennalta mรครคrรคtty mรครคrรค muistia. Tรคmรค ei pรคde dynaamiseen taulukkoon, koska se kasvattaa muistin kokoa tietyllรค tavalla tarpeen tullen.
Dynaamisten taulukoiden suorituskykyyn vaikuttavat tekijรคt
Matriisin alkukoko ja sen kasvutekijรค mรครคrรครคvรคt sen suorituskyvyn. Huomaa seuraavat seikat:
- Jos taulukolla on pieni koko ja pieni kasvutekijรค, se jatkaa muistin uudelleenallokointia useammin. Tรคmรค heikentรครค taulukon suorituskykyรค.
- Jos taulukolla on suuri koko ja suuri kasvutekijรค, siinรค on valtava mรครคrรค kรคyttรคmรคtรถntรค muistia. Tรคstรค johtuen koon muuttaminen voi kestรครค kauemmin. Tรคmรค heikentรครค taulukon suorituskykyรค.
Uusi avainsana
In C++, voimme luoda dynaamisen taulukon kรคyttรคmรคllรค uutta avainsanaa. Kohdistettavien kohteiden lukumรครคrรค mรครคritetรครคn hakasulkeissa. Tyypin nimen tulee edeltรครค tรคtรค. Pyydetty mรครคrรค kohteita jaetaan.
Syntaksi
Uusi avainsana kรคyttรครค seuraavan syntaksin:
pointer_variable = new data_type;
Osoitinmuuttuja on muuttujan nimi osoittimen muuttuja.
Tietotyypin on oltava kelvollinen C++ tietotyyppi.
Avainsana palauttaa sitten osoittimen ensimmรคiseen kohteeseen. Dynaamisen taulukon luomisen jรคlkeen voimme poistaa sen kรคyttรคmรคllรค delete-avainsanaa.
Esimerkki 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; }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto ohjelmaamme kรคyttรครคksesi sitรค tehtรคvรคt.
- Sisรคllytรค std-nimiavaruus ohjelmaamme, jotta voit kรคyttรครค sen luokkia kutsumatta sitรค.
- Kutsu main()-funktiota. Ohjelmalogiikka tulee lisรคtรค funktion runkoon.
- Mรครคritรค kaksi kokonaislukumuuttujaa x ja n.
- Tulosta konsoliin tekstiรค, joka kehottaa kรคyttรคjรครค syรถttรคmรครคn muuttujan n arvon.
- Lue kรคyttรคjรคn syรถte nรคppรคimistรถltรค ja mรครคritรค se muuttujaan n.
- Mรครคritรค taulukko sisรคltรคmรครคn yhteensรค n kokonaislukua ja mรครคritรค se osoitinmuuttujaan *arr.
- Tulosta viesti, joka kehottaa kรคyttรคjรครค syรถttรคmรครคn n mรครคrรคn kohteita.
- Kรคytรค for-silmukkaa luodaksesi silmukkamuuttujan x, joka toistaa kรคyttรคjรคn syรถttรคmiรค kohteita.
- Lue kรคyttรคjรคn syรถttรคmรคt elementit ja tallenna ne taulukkoarr.
- Rungon loppu silmukalle.
- Tulosta tekstiรค konsoliin.
- Kรคytรค for-silmukkaa luodaksesi silmukkamuuttujan x, joka toistaa taulukon alkioita.
- Tulosta arr-nimisen taulukon sisรคltรคmรคt arvot konsolissa.
- For-silmukan rungon loppu.
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Main()-funktion rungon loppu.
HUOMAUTUS: Yllรค olevassa esimerkissรค kรคyttรคjรค voi mรครคrittรครค taulukolle minkรค tahansa koon ajon aikana. Tรคmรค tarkoittaa, ettรค taulukon koko mรครคritetรครคn ajon aikana.
Alustetaan dynaamisesti allokoituja taulukoita
Dynaamisen taulukon alustaminen nollaan on helppoa.
Syntaksi:
int *array{ new int[length]{} };
Yllรค olevassa syntaksissa pituus tarkoittaa taulukkoon lisรคttรคvien elementtien mรครคrรครค. Koska meidรคn on alustettava taulukko nollaan, tรคmรค tulee jรคttรครค tyhjรคksi.
Voimme alustaa dynaamisen taulukon alustusluettelon avulla. Luodaan esimerkki, joka osoittaa tรคmรคn.
Esimerkki 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; }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto ohjelmaamme kรคyttรครคksesi sen toimintoja.
- Sisรคllytรค std-nimiavaruus ohjelmaamme, jotta voit kรคyttรครค sen luokkia kutsumatta sitรค.
- Kutsu main()-funktiota. Ohjelmalogiikka tulee lisรคtรค funktion runkoon.
- Ilmoita kokonaislukumuuttuja nimeltรค x.
- Mรครคritรค dynaaminen taulukko nimeltรค array kรคyttรคmรคllรค alustusluetteloa. Taulukko sisรคltรครค 5 kokonaislukuelementtiรค. Huomaa, ettรค emme ole kรคyttรคneet "="-operaattoria taulukon pituuden ja alustusluettelon vรคlissรค.
- Tulosta tekstiรค konsoliin. Loppu on a C++ avainsana, joka tarkoittaa loppuriviรค. Se siirtรครค kohdistimen seuraavaan lauseeseen.
- Kรคytรค for-silmukkaa toistaaksesi taulukon elementtejรค.
- Tulosta array-nimisen taulukon sisรคltรถ konsoliin.
- For-silmukan rungon loppu.
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Main()-funktion rungon loppu.
Arrayiden koon muuttaminen
Dynaamisen taulukon pituus asetetaan allokointiajan aikana.
Kuitenkin, C++ ei sisรคllรค sisรครคnrakennettua mekanismia taulukon koon muuttamiseen sen jรคlkeen, kun se on varattu.
Voit kuitenkin voittaa tรคmรคn haasteen varaamalla uuden taulukon dynaamisesti, kopioimalla elementit ja poistamalla sitten vanhan taulukon.
Huomaa: tรคmรค tekniikka on altis virheille, joten yritรค vรคlttรครค sitรค.
Dynaaminen taulukoiden poistaminen
Dynaaminen taulukko tulee poistaa tietokoneen muistista, kun sen tarkoitus on tรคytetty. Poista-lause voi auttaa sinua saavuttamaan tรคmรคn. Vapautunutta muistitilaa voidaan sitten kรคyttรครค toisen tietojoukon sรคilyttรคmiseen. Vaikka et poistaisikaan dynaamista taulukkoa tietokoneen muistista, se poistetaan automaattisesti, kun ohjelma pรครคttyy.
Huomautus:
Jos haluat poistaa dynaamisen taulukon tietokoneen muistista, kรคytรค delete[]-komentoa poistamisen sijaan. [] kehottaa CPU:ta poistamaan useita muuttujia yhden muuttujan sijaan. Poista-toiminnon kรคyttรถ delete[]:n sijaan kรคsiteltรคessรค dynaamista taulukkoa voi aiheuttaa ongelmia. Esimerkkejรค tรคllaisista ongelmista ovat muistivuodot, tietojen korruptio, kaatumiset jne.
Esimerkki 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; }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto ohjelmaamme, jotta voit kรคyttรครค sen toimintoja.
- Sisรคllytรค std-nimiavaruus ohjelmaamme, jotta voit kรคyttรครค sen luokkia kutsumatta sitรค.
- Kutsu main()-funktiota. Ohjelmalogiikka tulee lisรคtรค funktion runkoon.
- Ilmoita kaksi kokonaislukutietotyypin muuttujaa x ja n.
- Tulosta tekstiรค konsoliin. Teksti pyytรครค kรคyttรคjรครค ilmoittamaan syรถttรคmiensรค numeroiden mรครคrรคn.
- Lue kรคyttรคjรคn syรถte nรคppรคimistรถltรค. Syรถtearvo mรครคritetรครคn muuttujalle n.
- Ilmoita osoitinmuuttuja *arr. Taulukko arr varaa muistia yhteensรค n kokonaisluvun tallentamiseen.
- Tulosta konsoliin viesti, joka kehottaa kรคyttรคjรครค syรถttรคmรครคn n numeroa.
- Luo for-silmukka ja silmukkamuuttuja x toistaaksesi kรคyttรคjรคn syรถttรคmiรค lukuja.
- Lue kรคyttรคjรคn syรถttรคmรคt numerot ja tallenna ne taulukkoarr.
- For-silmukan rungon loppu.
- Tulosta tekstiรค konsoliin.
- Kรคytรค for-silmukkaa ja silmukkamuuttujaa x iteroidaksesi taulukon arr sisรคltรถรค.
- Tulosta taulukon arr arvot konsolista.
- For-silmukan rungon loppu.
- Tulosta tyhjรค rivi konsoliin.
- Vapauta taulukon arr muisti.
- Ohjelma palauttaa arvon, kun se on suoritettu onnistuneesti.
- Main()-funktion rungon loppu.






