nisfarm.ru

Co jsou dynamická pole C ++?

Pojďme definovat na začátku s tím, co je dynamické pole. Od časů C existují pole, ale jejich funkce byla pevná velikost, která byla specifikována při vytvoření a již se neměnila. Z tohoto důvodu se nazývají statické pole. Je zřejmé, že dynamické pole znamená, že během programu může změnit svou velikost. A také může být vytvořeno, když počet předpokládaných prvků je dokonce přibližně neznámý, tedy prázdný.

Správa dynamické paměti

Přidělení paměti v hromadě

Existuje taková věc, jako je správa dynamické paměti. Tento přístup k programování umožňuje co nejúčinnější využití paměti počítače. V C ++ je tento proces řízen novými a odstraněnými operacemi. Operace nové rezervy paměti v oblasti dynamické paměti, nebo také volal hromadu (free store nebo haldy v angličtině). Operace odstranění uvolní rezervaci.

Programovacími standardy musí být dynamická paměť sledována a vymazána včas, takže nové operace a operace mazání jsou často používány ve dvojicích. Tento princip byl již dávno zastaralý. Jeho kořeny rostou od doby, kdy operační systémy nevycházely z pamětí dobře, nebo prostě nevěděly, jak ji vyčistit samy. Operační systém vždy vymaže paměť po spuštění programu. Nicméně, výslovné vyčištění paměti je znamením dobrého tónu v programování.

Operace nové rezervy paměť pro objekt určitého typu a vrátí adresu do této paměti. Není-li z nějakého důvodu možné přidělení paměti, vrátí operace nulový ukazatel (ukazatel, který se nevztahuje na nic) a uděluje výjimku. Nový operátor pracuje s objekty jakýchkoli datových typů: dvojitý, char, int atd. Rozdělení paměti a její vymazání vypadají takto.

	int * p = new int- // * - znamená, že proměnná je ukazatel. Ukazatele ukládají adresy. * P = 9 - odstraní p-

Jednozměrné pole

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

	dvojitý * a = new double [10] - // a - ukazatel na paměti přidělené pro matici 10 prvků typu doublea [5] = 2,5 mazání [] a- // dbát na této konstrukci! Je mazaná!

Po odstranění příkazu musíte zadat hranaté závorky, označit pro program nadcházející operaci jako uvolnění nejen ukazatele na pole, ale také samotného pole.

Dvojrozměrné pole

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




	dvojitý ** ma = nový dvojitý * [5] - // krok 1 pro (int I = 0-I < 5- i ++) // krok 2ma [i] = nový dvojitý [10] -

Dynamické pole je tudíž vytvořeno v jazyce C ++ s rozměry 5 až 10. To doslova znamená, že v prvním kroku přidělí pole v paměti 5 prvků. A pak ve druhém kroku přidělit paměť pro pole deseti prvků a zapsat adresu do předchozího pole, a tak pro každý sloupec.

Dvourozměrné dynamické pole

Proč je použit ukazatel druhého řádu? Toto je ukazatel na ukazatel. Je trochu obtížné pochopit. Přestože kód doslova říká, abychom se dostali k nějaké hodnotě uložené v poli, musíme jít na adresu, dostat se tam ještě jedna adresa a pak vyjdeme k hodnotě.

Nezapomeňte, že paměťový deallocation design pro pole musel být zapamatován? Dvojrozměrné pole je zničeno následujícím způsobem.

	pro (int I = 0-i < 5l i ++) smazat [] ma [i] - // Zdá se nám, že jsme zapomněli somethinghellip-delete [] ma-

Nyní můžete snadno vytvořit i pět-dimenzionální pole.

Kde je "dynamika"?

Na začátku bylo řečeno, že velikost dynamického pole se během programu mění, ale v příkladech uvedených výše nikde nebylo výslovně uvedeno. Změny dimenzionality pole jsou provedeny pomocí následujícího algoritmu:

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

STL vektor - nové dynamické pole

Chcete-li použít vektory, musíte se připojit .

Jak víte, standardní knihovna šablon (STL) je vybavena sadou kontejnerů, které spravují sbírky prvků. Mezi kontejnery jsou po sobě následující kontejnery. Odlišují se hlavně při uspořádání prvků vkládacím časem. Jinými slovy, první prvek bude vždy první, druhý vždy druhý a tak dále. Existují i ​​jiné typy kontejnerů - asociativní, seřazené podle hodnoty prvků a vůbec neuspořádané.

Jeden takový následný kontejner je vektor. Řídí prvky pole C ++ v dynamické paměti. Přístup k těmto prvkům se provádí přímo na indexu. Vzhledem k tomu, že vektor je sekvenční kontejner, na konci pole se objevují a odstraňují prvky a tyto operace se provádějí velmi rychle. Nicméně, vložení nového prvku ve středu nebo horní části vektoru je mnohem pomalejší, neboť provádění tohoto postupu se pohybovat všechny předchozí prvky před vložením aktuálního čísla. Zvažme příklad.

#include #include int main () {std :: vektor v- // vytvoří prázdný vektor pro uložení prvků typu int // definovat vektor - prostor šablony STD, takže std :: pro (int i = 0- i <= 5 ++ i) {v.push_back (i) -} pro (int i = 0-i < v.size () - ++ i) {std :: cout << v [i] << "," - "std :: cout << std :: endl-system ("pauza") -}

Jak můžete vidět z kódu, práce s vektory je přesně stejná jako u polí. V tomto případě jsou vektory opatřeny užitečnými dalšími vlastnostmi, jako jsou funkce C ++ pro dynamické pole .size () a .push_back (). Přísně řečeno, tyto členské funkce patří do kontejneru.

Přidání vektorového prvku

Přístup k vektorovým prvkům

Přístup k vektorovým prvkům je téma, o kterém byste měli mluvit samostatně. Existují následující způsoby, jak odkázat na prvky vektoru.

V [index]

Standardní reference indexu

V.at (index)

S odkazem na prvek podle indexu, ale pokud překročíte rozsah, udělá se výjimka

V.front ()

S odkazem na první prvek vektoru

V.back ()

S odkazem na poslední prvek vektoru

Je zřejmé, že nejvíce jistý způsob, jak získat přístup k položky vektoru je volání funkce .at (), protože generuje výjimku out_of_range, které lze léčit v bloku try-catch. Provoz [] Funkce a .front () a .Zadní () v případě řady pracovat nepředvídatelně.

Dvojrozměrný vektor

Podívejme se na příklad vytvoření dvojrozměrného dynamického pole C ++ - jednoduché matice 5 na 5.

Schéma mn-matice
 vektor< vektor > v (5, vektor(5)) - v [2] [3] = 10 int = v [2] [3] -v [2] .push_back (5) - // vytvořit nový vstup na koncovém vektorav [2] .pop_back ( ) - // odstranit poslední prvek

Dvojrozměrný vektor je vektor vektorů. A s každým jednotlivým vektorem můžete pracovat: přidávat a odstraňovat prvky, používat funkce členů, jak je ukázáno v příkladu výše v posledním řádku. Můžete také použít iterátory. Na první pohled se zdá, že stavba je děsivá. Ale jen na začátku. Vektory jsou mnohem výkonnější, než je popsáno v tomto článku. Mohou být podrobně konzultovány v dokumentaci.

Odstranění vektorového prvku

Závěr

V nedávné minulosti museli programátoři vytvářet sami dynamická pole, včetně všech potřebných funkcí a algoritmů pro práci s nimi. Ale s příchodem STL mohou používat hotové, přemýšlené a účinné třídy. Proto byste znovu neměli znovu objevovat kolo, ale jednoduše používat vektory (nebo jiný vhodný kontejner). A pouze v případě potřeby pracujte se starými metodami.

Sdílet na sociálních sítích:

Podobné
© 2021 nisfarm.ru