C++ Dynaaminen taulukoiden allokointi esimerkin avulla
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:
Koodin 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:
Koodin 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:
Koodin 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.
Yhteenveto
- Tavallisilla taulukoilla on kiinteä koko. Et voi muuttaa niiden kokoa, kun ne on ilmoitettu.
- Tällaisissa taulukoissa muistin koko määritetään käännösajan aikana.
- Dynaamiset taulukot ovat erilaisia. Niiden kokoa voidaan muuttaa ajon aikana.
- Dynaamisissa taulukoissa koko määritetään ajon aikana.
- Dynaamiset taulukot sisään C++ ilmoitetaan käyttämällä uutta avainsanaa.
- Käytämme hakasulkeita määrittääksemme dynaamiseen taulukkoon tallennettavien kohteiden määrän.
- Kun taulukko on valmis, voimme vapauttaa muistia poisto-operaattorilla.
- Käytä delete-operaattoria ja [] vapauttaaksesi muistin kaikista taulukon elementeistä.
- Poistaminen ilman [] vapauttaa vain yhden elementin muistin.
- Ei ole sisäänrakennettua mekanismia koon muuttamiseen C++ taulukot.
- Emme käytä "="-operaattoria taulukon alustamiseen luettelon alustustoiminnolla.