Što su dinamički C ++ nizovi?

Počnimo s onim što je dinamički niz. Od vremena Si postoje nizovi, ali njihova značajka je fiksna veličina, koja je zabilježena pri stvaranju i više se nije mijenjala. Zbog toga su dobili naziv statički nizovi. Očito, dinamički niz znači da može promijeniti svoju veličinu tijekom programa. Također se može stvoriti kada je broj predviđenih elemenata čak i nepoznat, prazan.

Upravljanje dinamičkom memorijom

Postoji takav koncept kao dinamičko upravljanje memorijom. Ovakav pristup u programiranju omogućuje maksimalno iskorištavanje memorije vašeg računala. U C ++, ovaj proces se kontrolira novim i brisanjem operacija. Operacija nova rezerva memorije u području dinamičke memorije ili tzv. Hrpe (slobodna trgovina ili hrpa na engleskom). Prema tome, operacija brisanja oslobađa rezervaciju.


Prema standardima programiranja za dinamičku memoriju, potrebno je pratiti i pravovremeno čistiti, tako da se nove i brisane operacije često koriste u parovima. Ovaj je princip već odavno zastario. Njegovi korijeni rastu od vremena kada su operativni sustavi slabo gledani na memoriju ili jednostavno nisu znali kako ih sami očistiti. Sada operacijski sustav uvijek čisti memoriju nakon pokretanja programa. Međutim, eksplicitno čišćenje memorije znak je dobrog tona u programiranju. Nova operacija zadržava memoriju za objekt određene vrste i vraća adresu u tu memoriju. Ako se raspodjela memorije iz bilo kojeg razloga ne može izvesti, tada će operacija vratiti nulti pokazivač (pokazivač koji nijeodnosi se na ništa) i baca iznimku. Novi operator radi s objektima bilo koje vrste podataka: double, char, int, itd. Dodjeljivanje memorije i njeno uklanjanje su kako slijedi.




int * p = novo int; //* - znači da je varijabla pokazivač. Pokazivači pohranjuju adrese.
* p = 9;
brisanje p;

Jednodimenzionalno polje

Stvaranje jednodimenzionalnog dinamičkog niza jednako je stvaranju varijable u hrpi.

dvostruko * a = novo dvostruko 
; //a - pokazivač na memoriju dodijeljenu nizu od 10 elemenata tipa double
a
= 2.5;
izbrisati [] a; //pogledajte ovaj dizajn! Ona je lukava!

Nakon izjave brisanja potrebno je odrediti uglate zagrade za označavanje budućeg rada programa kao oslobađanje ne samo pokazivača na polje, nego i samog niza.

Dvodimenzionalni niz

Stvaranje jednodimenzionalnog dinamičkog niza je trivijalan zadatak. I ako nam je potreban višedimenzionalni niz

dvostruko ** ma = novi dvostruki * 
; //korak 1
za (int I = 0; ja ma [i] = novi dvostruki
;

Dakle, stvaranje dinamičkog niza u C ++ veličine 5 na 10. Doslovno to znači u prvom koraku raspodjele u memoriji niza od 5 elemenata, a zatim, u drugom koraku, dodjeljivanje memorije nizu od 10 elemenata i pisanje adrese na njoj u prethodnom nizu, i tako za svaki stupac. 31]

Zašto koristiti pokazivač drugog reda? Ovo je pokazivač na pokazivač. To je malo teško razumjeti. Iako nam kod doslovno govori da dođemo do neke vrijednosti pohranjene u nizu, moramo ići na adresu, dobititu je još jedna adresa, a onda se izvučemo na vrijednost.


& lt; script type = "text /javascript" & gt;
može blockSettings2 = {blockId: "R-A-70350-2", renderTo: "yandex_rtb_R-A-70350-2", async:! 0};

if (document.cookie.indexOf ("abmatch =") & gt; = 0) {
blockSettings2 = {blockId: "RA-70350-2", renderTo: "yandex_rtb_R-A-70350- 2 ", statId: 70350async: 0};
}

Funkcija (a, b, c, d, e) {a [c] = a [c] || [], a [c] .push (funkcija () {Ya .Context.AdvManager.render (blockSettings2)}), e = b.getElementsByTagName ("script") , d = b.createElement ("script"), d.type = "text /javascript", d.src = "//an.yandex.ru/system/context.js", d.async =! 0e.parentNode.insertBefore (d, e)} (ovaj, ovaj.dokument, "yandexContextAsyncCallbacks");

Zapamtite da je dizajn memorije za polje trebao biti zapamćen? Dvodimenzionalni niz je uništen kako slijedi.

za (int I = 0; i delete [] ma [i];
//čini se da smo nešto zaboravili
delete [] ma; 48]

Sada možete mirno stvoriti čak i petdimenzionalni niz.

Gdje je "govornik"?

Na početku je rečeno da se veličina dinamičkog niza mijenja dok se program izvodi, ali u primjerima iznad Ova promjena nigdje nije eksplicitno naznačena, a dimenzije izmjene niza izrađuju se pomoću sljedećeg algoritma:

  • U memoriji se stvara novi niz potrebnih veličina.
  • Podaci starog niza prepisuju se u novom nizu.
  • Stari masiv je uništen.
  • STL vektor - novi dinamički niz

    Za korištenje vektora potrebno je spojiti.

    Kao što znate, knjižnica standardnih predložaka (STL) ima skup spremnika koji upravljaju zbirkama elemenata. Kontejneri su konsekutivni spremnici. Razlikuju se uglavnom u uređenosti elemenata u vrijeme umetanja. Drugim riječima, prvi element će uvijek biti prvi, drugi uvijekdrugi, itd. Postoje i drugi tipovi kontejnera - asocijativni, poredani po vrijednosti elemenata i nisu potpuno regulirani.

    Jedan takav konsekutivni spremnik je vektor. Ona upravlja elementima C ++ niza u dinamičkoj memoriji. Pristup tim stavkama obavlja se izravno pomoću indeksa. Zbog činjenice da je vektor uzastopni kontejner, dodavanje i uklanjanje elemenata događa se na kraju niza i te operacije se izvode vrlo brzo. Međutim, umetanje novog elementa u sredinu ili početak vektora odvija se mnogo sporije, jer će za ovaj postupak morati pomaknuti sve prethodne elemente na trenutni broj umetanja. Razmotrite primjer.

    # uključuju
    # uključuju
    int main () {
    std :: vektor v ; //kreiranje praznog vektora za pohranjivanje elemenata tipa int
    //definiranje vektora je std prostorni predložak, tako da std ::
    za (int i = 0; i v.push_back (i);
    }
    za (int i = 0; i std :: cout v [i] ";";
    }
    std :: cout std :: endl;
    sustav ("pauza");
    }

    Kao što možete vidjeti iz koda, rad s vektorima provodi se točno na isti način kao i kod nizova, dok su vektori opskrbljeni korisnim dodatnim svojstvima, kao što je C ++ funkcija za dinamičke nizove. Strogo govoreći, te funkcije člana pripadaju spremniku.


    & lt; script type = "text /javascript" & gt;
    može blockSettings3 = {blockId: " RA-70350-3 ", iznajmljivanje erTo: "yandex_rtb_R-A-70350-3", async: 0};

    ako (document.cookie.indexOf ("abmatch =") & gt; = 0) {
    blockSettings3 = {blockId : "RA-70350-3", renderTo: "yandex_rtb_R-A-70350-3", statId: 70350async: 0};
    }

    Funkcija (a, b, c, d, e) {a [c] = a [c] || [], a [c] .push (funkcija () {Ya.Context.AdvManager.render (blockSettings3)} ), e = b.getElementsByTagName ("skripta") , d = b.createElement ("skripta"), d.type = "text /javascript", d.src = "//an.yandex.ru/system /context.js ", d.async =! 0e.parentNode.insertBefore (d, e)} (ovo, ovaj.dokument," yandexContextAsyncCallbacks ");

    Pristup vektorskim elementima

    Dobivanje pristupa vektorskim elementima je tema o kojoj treba raspravljati odvojeno. Postoje sljedeći načini pozivanja na elemente vektora.

    V [index]

    Standardna referenca po indeksu

    V. at (index)

    Pozivanje na element s indeksom, ali iznimke se stvaraju pri izlasku iz raspona

    V. front ()

    Poziv na prvi element vektora

    V. natrag ()

    Žalba na zadnji element vektora

    Očito, najtočniji način pristupa elementu vektora jest pozvati .at () funkciju, budući da generira iznimku out_of_rangea koja se može obraditi u try-catch bloku. Funkcija [] i funkcija .front () .back () rade na nepredvidiv način kada su izvan dopuštenog raspona.

    Dvodimenzionalni vektor

    Razmotrimo primjer stvaranja dvodimenzionalnog dinamičkog niza C ++ - jednostavna matrica 5 od 5.



    vektorski & gt; v (5 vektor 
    );
    v
    = 10;
    int a = v
    ;
    v
    .push_back
    ; //kreira novi element na kraju vektora
    v
    .pop_back (); //brisanje posljednjeg elementa

    Povezane publikacije