Što su dinamički nizovi C + +?

Definiramo za početak s onim što je dinamički niz. Od vremena C, postoje polja, ali njihova je značajka bila fiksna veličina, koja je specificirana pri stvaranju i više se nije mijenjala. Zbog toga se nazivaju statička polja. Očito, dinamično polje znači da može promijeniti veličinu tijekom programa. I može se stvoriti i kada je broj navodnih elemenata čak nepoznat, tj. Prazan.

Upravljanje dinamičkim memorijama

Alokacija memorije u hrpi

Postoji takva stvar kao i dinamičko upravljanje memorijom. Ovaj pristup programiranju omogućuje vam da što učinkovitije koristite memoriju računala. U C + +, taj se proces kontrolira novim i brisanim operacijama. Operacija zadržava novu memoriju na području dinamičke memorije ili se naziva gomilom (besplatna trgovina ili hrpa na engleskom jeziku). U skladu s time, operacija brisanja objavljuje rezervaciju.

Prema standardima programiranja, dinamička memorija treba pravilno pratiti i brisati, tako da se nove i operacije brisanja često koriste u parovima. Ovo je načelo davno zastarjelo. Njegovi korijeni rastu od vremena kada operacijski sustavi nisu slijedili dobro pamćenje, ili jednostavno nisu znali kako to sami očistiti. Sada OS uvijek briše memoriju nakon pokretanja programa. Međutim, izričito čišćenje memorije znak je dobrog tona u programiranju.

Operacija nova rezervira memoriju za objekt određene vrste i vraća adresu u ovu memoriju. Ako je iz nekog razloga nemoguće dodijeliti memoriju, operacija vraća null pokazivač (pokazivač koji ne govori ništa) i izuzima iznimku. Novi operator radi s objektima bilo koje vrste podataka: dvostruki, char, int, itd. Alokacija memorije i njegovo brisanje izgledaju ovako.

	int * p = novi int- // * - znači da je varijabla pokazivač. Poštari pohranjuju adrese. * P = 9-delete p-

Jednodimenzionalni niz

Izrada jednodimenzionalnog dinamičkog polja je jednaka stvaranju varijable na hrpi.

	dvostruko * a = novi dvostruki [10] - // a je pokazivač u memoriju dodijeljen nizu od 10 elemenata tipa doublea [5] = 2.5-delete [] a- // budite pažljivi na ovu konstrukciju! Ona je lukav!

Nakon izjave o brisanju, morate odrediti kvadratne zagrade, odrediti program za nadolazeću operaciju kao oslobađanje ne samo pokazivača u niz, nego i sam polje.

Dvodimenzionalni niz

Stvaranje jednodimenzionalnog dinamičkog polja trivijalni je zadatak. A ako nam je potreban višedimenzionalni niz ...

	dvostruko ** ma = novi dvostruki * [5] - // korak 1for (int I = 0-I < 5- i ++) // korak 2ma [i] = novi dvostruki [10] -

Dakle, u C + + se stvara dinamički niz s dimenzijom od 5 do 10. To doslovno znači, u prvom koraku, dodjeljivanje 5 elemenata u memoriji. I onda, u drugom koraku, dodjeljivanje memorije za niz od 10 elemenata i pisanje adrese na njemu u prethodnom nizu, a time i za svaki stupac.

Dvodimenzionalni dinamički raspored

Zašto se koristi pokazivač drugog reda? Ovo je pokazivač pokazivača. To je malo teško razumjeti. Iako nam kôd doslovno govori da dođemo do neke vrijednosti pohranjene u polju, moramo ići na adresu, dobiti još jednu adresu, a zatim ćemo izaći na vrijednost.

Imajte na umu da je sjećanje na raspored deallokacije memorije za polje? Dvodimenzionalni niz je uništen kako slijedi.

	za (int I = 0-i < 5l i ++) izbrisati [] ma [i] - // čini se da smo zaboravili somethinghellip-delete [] ma-

Sada možete jednostavno izraditi i petdimenzionalni niz.

Gdje je "dinamika"?

U početku je rečeno da se veličina dinamičkog polja mijenja tijekom programa, ali u gore navedenim primjerima, nigdje nije izričito naznačeno. Promjene u dimenzionalnosti polja izrađuju se pomoću sljedećeg algoritma:

  1. Nova memorija traženih veličina se stvara u memoriji.
  2. Podaci starog polja su prepisani u novom nizu.
  3. Stari niz je uništen.

STL vektor - novi dinamički niz

Da biste koristili vektore, morate se povezati .



Kao što znate, standardna biblioteka predložaka (STL) opremljena je skupom spremnika koji upravlja zbirkama elemenata. Među spremnicima su kontejnerski spremnici. Razlikuju se uglavnom u naručivanju elemenata pomoću vremena umetanja. Drugim riječima, prvi element će uvijek biti prvi, drugi uvijek drugi, itd. Postoje i druge vrste kontejnera - asocijativni, naručeni po vrijednosti elemenata i uopće neuredni.

Jedan takav uzastopni spremnik je vektor. Upravlja elementima C + + nizova u dinamičkoj memoriji. Pristup tim elementima provodi se izravno na indeksu. Zbog činjenice da je vektor sekvencijalni spremnik, dodavanje i uklanjanje elemenata pojavljuje se na kraju polja i te operacije se izvode vrlo brzo. Međutim, umetanje novog elementa u sredinu ili početak vektora znatno je sporiji, jer za izvođenje ovog postupka morat ćete premjestiti sve prethodne elemente na trenutni broj umetanja. Razmotrimo primjer.

#include #include int main () {std :: vektor v- // stvoriti prazan vektor za pohranjivanje elemenata tipa int // definicija vektora je predložak prostora std, pa std :: for (int i = 0-i <= 5- ++ i) {v.push_back (i) -} za (int i = 0-i < v.size () - ++ i) {std :: cout << v [i] << "," - "std :: cout << std :: endl-system ("pause") -}

Kao što možete vidjeti iz koda, rad s vektorima je točno onakav s poljem. U ovom slučaju, vektori imaju korisna dodatna svojstva, kao što su C ++ funkcije za dinamičke polja .size () i .push_back (). Strogo govoreći, te funkcije članova pripadaju spremniku.

Dodavanje elementa vektora

Pristup vektorskim elementima

Pristupanje elementima vektora je tema o kojoj biste trebali razgovarati zasebno. Postoje sljedeći načini za upućivanje na elemente vektora.

V [indeks]

Standardni referentni indeks

V.at (indeks)

Pozivajući se na element prema indeksu, ali ako prelazite raspon, izuzima se iznimka

V.front ()

Pozivajući se na prvi element vektora

V.back ()

Pozivajući se na posljednji element vektora

Očito, najtočniji način pristupa vektorskom elementu je nazvati funkciju .at (), jer generira izuzetak outgof_range koji se može obraditi u bloku za pokušaj hvatanja. Operacija [] i .front () i .back () funkcije, ako nisu raspoređene, rade na nepredvidljiv način.

Dvodimenzionalni vektor

Razmotrimo primjer stvaranja dvodimenzionalnog dinamičkog polja C ++ - jednostavne matrice 5 na 5.

Mn matrica sheme
 vektor< vektor > v (5, vektorPush_back (5) - // stvoriti novi element na kraju vektora v [2] .pop_back ((5)) - v [2] [3] = 10-int a = ) - // izbrišite posljednji element

Dvodimenzionalni vektor je vektor vektora. I sa svakim pojedinačnim vektorom možete raditi: dodavanje i uklanjanje elemenata, korištenje funkcija članova, kao što je prikazano u gornjem primjeru u posljednjem retku. Također možete koristiti iteracije. Na prvi pogled izgleda da je građevina zastrašujuća. Ali samo u početku. Vektori su mnogo moćniji od opisanih u ovom članku. Mogu ih se detaljno konzultirati u dokumentaciji.

Brisanje elementa vektora

zaključak

U nedavnoj prošlosti, programeri su morali stvoriti dinamičke polja, uključujući sve potrebne funkcije i algoritme za rad s njima. No, s dolaskom STL, oni mogu koristiti gotove, promišljene i učinkovite klase. Stoga ne biste trebali ponovo nagovoriti kotač, već jednostavno koristiti vektore (ili neki drugi prikladan spremnik). I samo ako je potrebno, radite sa starim metodama.

Dijelite na društvenim mrežama:

Povezan
Java polja žica. Razvrstavanje polja u Java. Dvodimenzionalni Java rasporedJava polja žica. Razvrstavanje polja u Java. Dvodimenzionalni Java raspored
Rasporedi su ... Kratak uvod u temuRasporedi su ... Kratak uvod u temu
Što je procesor za: opis, karakteristike i primjenuŠto je procesor za: opis, karakteristike i primjenu
Kako povećati memoriju na prijenosnom računalu: savjetiKako povećati memoriju na prijenosnom računalu: savjeti
PHP: zadnji element. Raspored u dinamiciPHP: zadnji element. Raspored u dinamici
Java raspored. Rasporedi u Javi. Java za početnikeJava raspored. Rasporedi u Javi. Java za početnike
Mjehurić sortiranje jednodimenzionalnog polja: algoritam, programski kod na C jezikuMjehurić sortiranje jednodimenzionalnog polja: algoritam, programski kod na C jeziku
Električni vodovi. uvodElektrični vodovi. uvod
Kako očistiti virtualnu memoriju i zašto je to potrebnoKako očistiti virtualnu memoriju i zašto je to potrebno
Što je RAM?Što je RAM?
» » Što su dinamički nizovi C + +?
LiveInternet