Čo sú to dynamické C ++ polia?

Začnime tým, čo je dynamické pole. Od doby Si existujú pole, ale ich vlastnosť bola pevná veľkosť, ktorá bola zaznamenaná pri stvorení a už sa nezmenila. Vďaka tomu dostali názov statické pole. Je zrejmé, že dynamické pole znamená, že počas programu môže zmeniť svoju veľkosť. A môže sa vytvoriť aj vtedy, keď je počet predpokladaných prvkov dokonca neznámy, je prázdny.

Riadenie dynamickej pamäte

Existuje taká koncepcia ako správa dynamickej pamäte. Tento prístup v programovaní vám umožňuje maximálne využiť pamäť vášho počítača. V C ++ je tento proces riadený novými operáciami a operáciami odstraňovania. Prevádzkovanie pamäte nových rezerv v oblasti dynamickej pamäte alebo tzv. Haldy (bezplatný obchod alebo hromada v angličtine). Operácia odstránenia teda uvoľňuje rezerváciu.


Podľa štandardov programovania pre dynamickú pamäť je potrebné monitorovať a včas vyčistiť, takže nové a vymazávacie operácie sa často používajú v pároch. Táto zásada bola už dávno zastaraná. Jeho korene rastú od doby, keď boli operačné systémy zle sledované na pamäť, alebo jednoducho nevedeli, ako ich vlastne vyčistiť. Operačný systém vždy vymaže pamäť po spustení programu. Avšak explicitné vymazanie pamäte je znakom dobrého tónu v programovaní. Nová operácia si vyhradzuje pamäť pre objekt určitého typu a vráti adresu do tejto pamäte. Ak priradenie pamäte z akéhokoľvek dôvodu nemôže byť vykonané, operácia vráti nulový ukazovateľ (ukazovateľ, ktorý nie jenič nehovorí) a ukladá výnimku. Nový operátor pracuje s objektmi akéhokoľvek typu údajov: dvojitý, char, int atď. Rozdelenie pamäte a jej odstránenie sú nasledovné.




int * p = nový int; //* - znamená, že premenná je ukazovateľ. Ukazovatele ukladajú adresy.
* p = 9;
odstrániť p;

Jednorozmerné pole

Vytvorenie jednorozmerného dynamického poľa je rovnaké ako vytváranie premennej v halde.

dvojité * a = nové dvojité 
; //a - ukazovateľ k pamäti pridelenej poľa 10 prvkov typu double
a
= 2.5;
odstrániť [] a; //sa pozrieť na tento dizajn! Je mazaná!

Po výmazovom výpise je potrebné špecifikovať hranaté zátvorky pre označenie budúcej operácie pre program ako uvoľnenie nielen ukazovateľa do poľa, ale samotného poľa.

Dvojrozmerné pole

Vytvorenie jednorozmerného dynamického poľa je triviálna úloha. A ak potrebujeme multidimenzionálne pole

dvojité ** ma = nové dvojité * 
; //krok 1
pre (int I = 0; I ma) je nový dvojitý
;

10. Doslova to znamená v prvom kroku pridelenia pamäte do poľa 5 prvkov a potom v druhom kroku pridelenie pamäte do poľa 10 prvkov a napísanie adresy na nej v predchádzajúcom poli a tak pre každý stĺpec. 31]

Prečo používať ukazovateľ druhej objednávky? Toto je ukazovateľ na ukazovateľ. Je to trochu ťažké pochopiť. Hoci kód doslova hovorí, že sa dostaneme k nejakej hodnote uloženej v poli, musíme ísť na adresu, dostaťexistuje ďalšia adresa a potom sa dostaneme k hodnote.


na začiatku bolo povedané, že veľkosť dynamické pole sa mení v priebehu programu, ale vo vyššie uvedených príkladoch Táto zmena nebola nikde explicitne indikovaná Rozmery zmeny poľa sa robili pomocou nasledujúceho algoritmu:

  1. V pamäti sa vytvorí nové pole požadovaných veľkostí.
  2. Údaje starého poľa sa prepisujú do nového poľa.
  3. Starý masív je zničený.

vektor STL - nové dynamické pole

Ak chcete použiť vektory, musíte sa pripojiť.

Ako viete, štandardná knižnica šablón (STL) je vybavená sadu kontajnerov, ktoré spravujú zbierky prvkov. Kontajnery sú po sebe idúce kontajnery. Odlišujú sa hlavne v usporiadaní prvkov v čase vkladania. Inými slovami, prvý prvok bude vždy prvý, druhý vždy., Druhý, a tak ďalej d Existujú aj iné typy obalov - asociatívne triedené podľa hodnoty a vynikajúcich prvkov vôbec.

Jedným z týchto zásobníkov je v súlade vektor. Spravuje prvky C ++ poľa v dynamickej pamäti. Prístup k týmto položkám sa vykonáva priamo indexom. Vzhľadom k tomu, vektor - kontajner sekvencie, pridanie a odstránenie položiek prebieha na konci poľa, a tieto operácie sú veľmi rýchlo. Avšak, vloženie nového prvku do stredu alebo na začiatku vektora je oveľa pomalší, pretože vykonávanie tohto postupu budú musieť presunúť všetky predchádzajúce prvky súčasnej vloženie čísla. Zvážte príklad.

#include
#include
int main () {
std :: vektor v ; //vytvorí prázdny vektor skladovanie vložkami int
//definíciu vektor - priestor šablóny std, pretože std ::
pre (int i = 0; i v.push_back (i),
} (76 ) pre (int i = 0; i std :: cout v [i] "",
,}
std :: cout std :: Endl
systému ("pause"),
}

, ako je uvedené v kóde, pracovať s vektormi sa vykonáva rovnakým spôsobom ako pole. tak vektory opatrené ďalšími užitočnými vlastnosťami, ako je C ++ funkcie pre dynamické pole .size (.). .push_back () Presnejšie povedané, tieto funkcie členov sú nádoba


& lt; script type = "text /javascript" & gt;
var blockSettings3 = {blockId " RA-70350-3 ", prenájom Erto: "yandex_rtb_R-A-70350-3", async:! 0},

, ak (document.cookie.indexOf ("abmatch =") väčšie alebo rovné 0) {
blockSettings3 = {blockId : "RA-70350-3", renderTo "yandex_rtb_R-A-70350-3", statId: 70350async:! 0},
,}

! Funkcia (a, b, c, d, e) {a [c] = a [c] || [], a [c] .push (funkcia () {Ya.Context.AdvManager.render (blockSettings3)} ), e = b.getElementsByTagName ("scenár") , d = b.createElement ("scenár"), d.type = "text /javascript", d.src = "//an.yandex.ru/systém /context.js "d.async = 0e.parentNode.insertBefore (d, e)} (to, this.document ,!" yandexContextAsyncCallbacks ");

Prístup k vektorovým prvkom

Získanie prístupu k vektorovým prvkom je téma, o ktorom by sa malo diskutovať osobitne. Existujú nasledujúce spôsoby, ako odkázať na prvky vektora.

V [index]

Štandardný odkaz podľa indexu

, V. v (index)

Odvolanie k prvku indexu, ale mimo rozsah výnimky je generovaný

V. pred ()

Odvolanie na prvý prvok vektora

V. späť ()

Odvolanie sa na posledný prvok vektora

Je zrejmé, že najviac istý spôsob, ako osloviť prvkov vektora je volanie funkcie .at (), pretože generuje výnimku out_of_range, ktoré môžu byť spracované v bloku try-catch. Funkcia [] a funkcia .front () .back () fungujú nepredvídateľným spôsobom, ak sú mimo povoleného rozsahu.

Dvojrozmerná vektor

Uvažujme príklad dvoch-rozmerné pole dynamického C ++ - jednoduché matica 5 od 5.



vektor> v (5 vektor 
);
v
= 10;
int a = v
;
v
.push_back
; //vytvorí nový prvok na konci vektora
v
.pop_back (); //odstrániť posledný prvok

Súvisiace publikácie