OqPoWah.com

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.

Dinamično upravljanje pomnilnika

Dodelitev pomnilnika v kup

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.

Dvodimenzionalna dinamična matrika

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:

  1. V pomnilniku se ustvari nov niz potrebnih velikosti.
  2. Podatki stare matrike se prepišejo v novo matriko.
  3. 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.

Dodajanje vektorskega elementa

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.

Shema mn-matrike
 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.

Brisanje elementa vektorja

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.

Zdieľať na sociálnych sieťach:

Príbuzný