Š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.
sadržaj
Upravljanje dinamičkim memorijama
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.
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:
- Nova memorija traženih veličina se stvara u memoriji.
- Podaci starog polja su prepisani u novom nizu.
- 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.
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.
vektor< vektor > v (5, vektor Push_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.
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.
- Virtualna memorija računala. Kako očistiti virtualnu memoriju računala
- Java polja žica. Razvrstavanje polja u Java. Dvodimenzionalni Java raspored
- Rasporedi su ... Kratak uvod u temu
- Što je procesor za: opis, karakteristike i primjenu
- Kako povećati memoriju na prijenosnom računalu: savjeti
- PHP: zadnji element. Raspored u dinamici
- Java raspored. Rasporedi u Javi. Java za početnike
- Mjehurić sortiranje jednodimenzionalnog polja: algoritam, programski kod na C jeziku
- Električni vodovi. uvod
- Kako očistiti virtualnu memoriju i zašto je to potrebno
- Što je RAM?
- Koja je virtualna memorija računala?
- Popularne metode grupiranja elemenata polja: sortiranje umetanjem i korištenjem ključa
- Što je memorijska memorija?
- Kratkoročna memorija
- Razvrstavanje algoritama kakvi jesu
- Dinamički niz i njegove značajke
- Strukturirani tip - jednodimenzionalni niz
- Statička i dinamička IP adresa
- Statička i dinamička memorija u okruženju računala
- Kako povećati virtualnu memoriju? instrukcija