Co jsou dynamické C ++ pole?

Začneme tím, co je dynamické pole. Od doby Si existují pole, ale jejich rys byl pevný rozměr, který byl zaznamenán u stvoření a už se nezměnil. Díky tomu dostali název statické pole. Je zřejmé, že dynamické pole znamená, že během programu může změnit svou velikost. A může se také vytvořit, když je počet předpokládaných prvků dokonce neznámý, je prázdný.

Řízení dynamické paměti

Existuje taková koncepce jako správa dynamické paměti. Tento přístup v programování umožňuje maximálně využít paměti vašeho počítače. V C ++ je tento proces řízen novými a odstraněnými operacemi. Provoz paměti nových rezerv v oblasti dynamické paměti nebo tzv. Haldy (bezplatný obchod nebo halda v angličtině). Z tohoto důvodu uvolnění rezervace uvolní rezervaci.


Podle standardů programování pro dynamickou paměť je nutné monitorovat a včas vyčistit, takže nové operace a odstraňování jsou často používány ve dvojicích. Tento princip byl již dávno zastaralý. Jeho kořeny rostou od doby, kdy byly operační systémy špatně sledovány pro paměť, nebo prostě nevěděly, jak je vyčistit sám. Operační systém vždy vymaže paměť po spuštění programu. Nicméně, výslovné vymazání paměti je znamením dobrého tónu v programování. Nová operace si vyhrazuje paměť pro objekt určitého typu a vrátí adresu do paměti. Pokud nelze z libovolného důvodu alokovat paměť, operace vrátí nulový ukazatel (ukazatel, který neníodkazuje na nic) a uděluje výjimku. Nový operátor pracuje s objekty jakéhokoli typu dat: dvojitý, char, int atd. Rozdělení paměti a její odstranění jsou následující.




int * p = nová int; //* - znamená, že proměnná je ukazatel. Ukazatele ukládají adresy.
* p = 9;
odstranit p;

Jednorozměrové pole

Vytvoření jednorozměrného dynamického pole je stejné jako vytváření proměnné v haldě.

dvojité * a = nové dvojité 
; //a - ukazatel na paměť přidělenou pole 10 prvků typu double
a
= 2.5;
odstranit [] a; //pečlivě se podívejte na tento design! Je mazaná!

Po příkazu smazání je nutné zadat hranaté závorky pro označování budoucí operace pro program jako uvolnění nejen ukazatele na pole, ale i samotné pole.

Dvourozměrné pole

Vytvoření jednorozměrného dynamického pole je triviální úkol. A pokud potřebujeme multidimenzionální pole

dvojité ** ma = nové dvojité * 
; //krok 1
pro (int I = 0; I ma [i] = nový dvojitý
; 30)

10. Doslova to znamená, že v prvním kroku přidělíme do paměti řadu 5 prvků a pak ve druhém kroku přidělíme paměť na pole deseti prvků a zapíšeme adresu na ní v předchozím poli, a tak pro každý sloupec.

Proč používat ukazatel druhého řádu? Toto je ukazatel na ukazatel. Je trochu obtížné pochopit. Ačkoli kód doslova říká, abychom se dostali k nějaké hodnotě uložené v poli, musíme jít na adresu, dostat setam je další adresa a pak se dostaneme k hodnotě.


na začátku bylo řečeno, že velikost dynamické pole se mění v průběhu programu, ale ve výše uvedených příkladech Tato změna nebyla nikde explicitně označena. Rozměry změny pole jsou provedeny pomocí následujícího algoritmu:

  1. V paměti je vytvořeno nové pole požadovaných velikostí.
  2. Data starého pole jsou přepsána do nového pole.
  3. Starý masív je zničen.

vektor STL - nové dynamické pole

Pro použití vektorů je nutné připojit.

Jak je známo, standardní Template Library (STL) je vybaven sadou kontejnerů, které spravují sbírky předmětů. Kontejnery jsou kontejnery. Liší se hlavně v pořádku prvků v době vkládání. Jinými slovy, první prvek bude vždy první, druhý vždy., Druhý, a tak dále d Existují i ​​jiné typy obalů - asociativní tříděné podle hodnoty a vynikajících prvků vůbec.

Jeden takový následný kontejner je vektor. Řídí prvky pole C ++ v dynamické paměti. Přístup k těmto položkám se provádí přímo podle indexu. Vzhledem k tomu, vektor - kontejner sekvence, přidání a odstranění položek probíhá na konci pole, a tyto operace jsou velmi rychle. Nicméně, vložení nového prvku do středu nebo na začátku vektoru je mnohem pomalejší, neboť provádění tohoto postupu budou muset přesunout všechny předchozí prvky současné vložení čísla. Zvažte příklad.

#include
#include
int main () {
std :: vektor v ; //vytvoří prázdný vektor skladování vložkami int
//definici vektor - prostor šablony std, protože std ::
pro (int i = 0; i v.push_back (i),
} (76 ) pro (int i = 0; i std :: cout v [i] "",
,}
std :: cout std :: Endl
systému ("pause"),
}

, jak je uvedeno v kódu, pracovat s vektory se provádí stejným způsobem jako pole. tak vektory opatřeny dalšími užitečnými vlastnostmi, jako je C ++ funkce pro dynamická pole .size (.). .push_back () Přesněji řečeno, tyto funkce členů jsou nádoba


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

, pokud (document.cookie.indexOf ("abmatch =") větší nebo rovno 0) {
blockSettings3 = {blockId : "RA-70350-3", renderTo "yandex_rtb_R-A-70350-3", statId: 70350async :! 0},
,}

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

Přístup k vektorovým prvkům

Získání přístupu k vektorovým prvkům je téma, které by mělo být projednáno odděleně. Existují následující způsoby, jak odkázat na prvky vektoru.

V [index]

, index Standardní léčba

, V. v (index)

Odvolání k prvku indexu, ale mimo rozsah výjimky je generován

V. přední ()

Adresa na první prvek vektoru

V. zpět ()

Odvolání k poslední prvek vektoru

Je zřejmé, že nejvíce jistý způsob, jak oslovit prvků vektoru je volání funkce .at (), protože generuje výjimku out_of_range, které mohou být zpracovány v bloku try-catch. Funkce [] a funkce .front () .back () pracují nepředvídatelným způsobem mimo přípustný rozsah.

Dvourozměrná vektor

Uvažujme příklad dvou-rozměrné pole dynamického C ++ - jednoduché matice 5 od 5.



vektor> v (5 vektor 
);
v
= 10;
int a = v
;
v
.push_back
; //vytvoří nový prvek na konci vektoru
v
.pop_back (); //odstranit poslední prvek

Související publikace