Kaj so dinamični nizi C + +?
Za začetek definiramo, kaj je dinamična matrika. Od časa C so polja, vendar je njihova funkcija določena velikost, ki je bila določena pri kreaciji in se ni več spremenila. Zaradi tega se imenujejo statične matrike. Očitno dinamična matrika pomeni, da lahko med programom spremeni svojo velikost. Prav tako se lahko ustvari, ko je število domnevnih elementov celo približno nepoznano, torej prazno.
Vsebina
Dinamično upravljanje pomnilnika

Obstaja taka stvar kot dinamično upravljanje pomnilnika. Ta pristop k programiranju vam omogoča, da računalniški pomnilnik uporabljate čim bolj učinkovito. V C + + je ta postopek nadzorovan z novimi in brisalnimi operacijami. Operacija nov pridržuje pomnilnik na območju dinamičnega pomnilnika ali se imenuje tudi kup (brezplačno shranjevanje ali kup v angleščini). Skladno s tem operacija brisanja sprosti rezervacijo.
S programskimi standardi je treba dinamični pomnilnik pravočasno nadzorovati in brisati, zato se novi in brisanje pogosto uporabljajo v parih. To načelo že dolgo zastarelo. Njegove korenine naraščajo že od časa, ko operacijski sistemi niso dobro upoštevali spomina ali preprosto niso vedeli, kako ga očistiti sami. Zdaj OS vedno izbriše pomnilnik po zagonu programa. Vendar je izrecno čiščenje pomnilnika znak dobrega tona pri programiranju.
Operacija nov pridržuje pomnilnik za predmet določenega tipa in vrne naslov v ta pomnilnik. Če je dodelitev pomnilnika iz nekega razloga nemogoča, operacija vrne neveljavni kazalec (kazalec, ki se ne nanaša na nič) in vrže izjemo. Nov operater deluje z objekti vseh vrst podatkov: dvojno, char, int itd. Razporeditev pomnilnika in brisanje sta videti takole.
int * p = novo int-// * - pomeni, da je spremenljivka kazalec. Naslovi za shranjevanje kazalcev. * P = 9-izbrišite p-
Enodimenzionalna array
Ustvarjanje enodimenzionalne dinamične matrike je enako kot ustvarjanje spremenljivke na kopici.
dvojna ali * = nova dvojna [10] - // a - kazalec na pomnilnik dodeljen za paleto 10 elementov tipa doublea [5] = 2.5 izbrisati [] a- // nameni pozornost tega modela! Zmešana je!
Po izjavi o izbrisu morate določiti kvadratni oklepaji, za program določiti prihajajočo operacijo kot sprostitev ne le kazalca na matriko, temveč tudi sama sama.
Dvodimenzionalna array
Ustvarjanje enodimenzionalne dinamične matrike je trivialna naloga. In če potrebujemo večdimenzionalno matriko ...
dvojno ** ma = novo dvojno * [5] - // korak 1 za (int I = 0-I < 5- i ++) // korak 2ma [i] = novo dvojno [10] -
Tako je dinamična matrika ustvarjena v C + + z razsežnostjo 5 za 10. To v dobesednem smislu pomeni, da pri prvem koraku dodelite niz 5 elementov v pomnilniku. In nato v drugem koraku dodeljevanje pomnilnika za niz 10 elementov in zapisovanje naslova v prejšnji niz, in tako za vsak stolpec.

Zakaj se uporablja kazalec drugega reda? To je kazalec na kazalniku. To je malo težko razumeti. Čeprav kodo dobesedno govori, da pridemo do neke vrednosti, shranjene v matriki, moramo iti na naslov, dodati še en naslov in nato gremo na vrednost.
Ne pozabite, da je bilo treba zapomniti pomnilnik deallocation layout za matriko? Dvodimenzionalna array se uniči, kot sledi.
za (int I = 0-i < 5l i ++) izbrišite [] ma [i] - // se mi zdi, da smo pozabili nekajhellip-delete [] ma-
Sedaj lahko enostavno ustvarite celo pet-dimenzionalno polje.
Kje je "dinamika"?
V začetku je bilo rečeno, da se velikost dinamične matrike med programom spreminja, v zgornjih primerih pa nikjer ni bila izrecno navedena. Spremembe v dimenziji array se izvajajo z naslednjim algoritmom:
- V pomnilniku se ustvari nov niz potrebnih velikosti.
- Podatki stare matrike se prepišejo v novo matriko.
- Stara polja so uničena.
STL vektor - nova dinamična matrika
Če želite uporabiti vektorje, se morate povezati
Kot veste, je standardna knjižnica predlog (STL) opremljena z nizom vsebnikov, ki upravljajo zbirke elementov. Med zabojniki so zaporedne posode. Razlikujejo se predvsem pri naročanju elementov s časom vstavljanja. Z drugimi besedami, prvi element bo vedno prvi, drugi vedno drugi, in tako naprej. Obstajajo še druge vrste zabojnikov - asociativne, urejene po vrednosti elementov in sploh neurejene.
En tak zaporedni vsebnik je vektor. Upravlja elemente matrike C + + v dinamičnem pomnilniku. Dostop do teh elementov se izvaja neposredno na indeksu. Ker je vektor zaporedno posodo, se na koncu matrike pojavijo in odstranjujejo elementi, ki se izvajajo zelo hitro. Vendar je vstavitev novega elementa v sredino ali začetek vektorja veliko počasnejša, saj boste za izvedbo tega postopka morali premakniti vse prejšnje elemente na trenutno vstavljeno številko. Poglejmo si primer.
#include #include int main () {std :: vektor v- // ustvarite prazen vektor za shranjevanje elementov tipa int // definicija vektorja je predloga prostora std, tako da 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 ("pavza") -}
Kot lahko vidite iz kode, je delo z vektorji popolnoma enako kot z nizi. V tem primeru so vektorjem zagotovljene uporabne dodatne lastnosti, kot so funkcije C ++ za dinamične matrike .size () in .push_back (). Strogo rečeno, te funkcije članstva pripadajo vsebniku.

Dostop do vektorskih elementov
Dostop do elementov vektorja je tema, o kateri bi morali govoriti ločeno. Obstajajo naslednji načini označevanja elementov vektorja.
V [indeks] | Standardna referenca indeksa |
V.at (indeks) | Sklicevanje na element po indeksu, če pa presegate obseg, se izpušča izjema |
V.front () | Sklicujoč se na prvi element vektorja |
V.back () | Sklicujoč se na zadnji element vektorja |
Očitno je najbolj natančen način dostopa do vektorskega elementa, da pokličete funkcijo .at (), ker ustvarja izjemo, ki jo lahko obdela v blok preizkusnega ulova. Operacije [] in funkcije .front () in .back (), če so zunaj dosega, delujejo nepredvidljivo.
Dvodimenzionalni vektor
Poglejmo si primer ustvarjanja dvodimenzionalne dinamične matrike C ++ - preprosta matrika 5 na 5.

vektor< vektor > v (5, vektor (5)) - proti [2] [3] = 10-int A = proti [2] [3] -v [2] .push_back (5) - // ustvariti nov prevod konec vektorav [2] .pop_back ( ) - // izbrišite zadnji element
Dvodimenzionalni vektor je vektor vektorjev. In z vsakim posameznim vektorjem lahko delate: dodajte in odstranite elemente, uporabite funkcije člana, kot je prikazano v zgornjem primeru v zadnji vrstici. Uporabite lahko tudi iteratorje. Na prvi pogled se zdi, da je gradnja zastrašujoča. Toda samo na začetku. Vektorji so veliko močnejši, kot je opisano v tem članku. Podrobnosti so na voljo v dokumentaciji.

Zaključek
V nedavni preteklosti so morali programerji sami ustvariti dinamične nize, vključno z vsemi potrebnimi funkcijami in algoritmi za delo z njimi. Toda s prihodom STL lahko uporabljajo pripravljene, premišljene in učinkovite razrede. Zato ne smete znova znova izdelati kolesa, temveč preprosto uporabite vektorje (ali drugo primerno posodo). In samo po potrebi, delajte s starimi metodami.
Zunanji računalniški pomnilnik
Kako povečati RAM računalnika.
Virtualni računalniški pomnilnik in načini za njegovo povečanje
Kako namestiti in kako očistiti RAM
Virtualni pomnilnik računalnika. Kako odstraniti navidezni računalniški pomnilnik
Java nizi nizov. Razvrščanje matrike v Java. Dvodimenzionalna Java matrika
Java Array. Nizi v Java. Java za začetnike
Dinamični DNS: nastavitev
Matematična matrika. Množenje matrik
Kako izgleda prenosna matrika? Njene lastnosti in definicije
Kako odstraniti navidezni pomnilnik in zakaj je to treba storiti
Datoteka zamenjave: še vedno obstaja ...
Kaj je računalniški pomnilnik?
Kaj je RAM?
Kaj je navidezni pomnilnik računalnika?
Priljubljeni načini za razvrščanje elementov matrike: sortiranje z vstavki in uporabo ključa
Dinamična matrika in njegove funkcije
Strukturirani tip - enodimenzionalna matrika
Statični in dinamični IP naslov
Statični in dinamični pomnilnik v računalniškem okolju
Kaj je računalniški RAM in kako to vpliva na njegovo delovanje