Co je to dynamické pole?
Dynamické pole je docela podobné běžnému poli, ale jeho velikost je během běhu programu upravitelná. Prvky DynamArray zabírají souvislý blok paměti.
Po vytvoření pole nelze jeho velikost změnit. Dynamické pole je však jiné. Dynamické pole může zvětšit svou velikost i po vyplnění.
Během vytváření pole je mu přiděleno předem určené množství paměti. To u dynamického pole neplatí, protože v případě potřeby zvětší velikost paměti o určitý faktor.
V tomto výukovém programu C ++ se naučíte
- Co je to dynamické pole?
- Faktory ovlivňující výkon dynamických polí
- Nové klíčové slovo
- Inicializace dynamicky přidělených polí
- Změna velikosti polí
- Dynamické mazání polí
Faktory ovlivňující výkon dynamických polí
Počáteční velikost pole a jeho růstový faktor určují jeho výkon. Všimněte si následujících bodů:
- Pokud má pole malou velikost a malý růstový faktor, bude udržovat realokaci paměti častěji. Tím se sníží výkon pole.
- Pokud má pole velkou velikost a velký růstový faktor, bude mít obrovskou část nevyužité paměti. Z tohoto důvodu může operace změny velikosti trvat déle. Tím se sníží výkon pole.
Nové klíčové slovo
V C ++ můžeme vytvořit dynamické pole pomocí nového klíčového slova. Počet položek, které mají být přiděleny, je uveden v dvojici hranatých závorek. Název typu by měl předcházet. Bude přidělen požadovaný počet položek.
Syntax:
Nové klíčové slovo má následující syntaxi:
pointer_variable = new data_type;
Pointer_variable je název proměnné ukazatele.
Data_type musí být platný datový typ C ++.
Klíčové slovo pak vrátí ukazatel na první položku. Po vytvoření dynamického pole jej můžeme odstranit pomocí klíčového slova delete.
Příklad 1:
#includeusing namespace std;int main() {int x, n;cout << "Enter the number of items: << "\n";cin >>n;int *arr = new int(n);cout << "Enter " << n << " items" << endl;for (x = 0; x < n; x++) {cin >> arr[x];}cout << "You entered: ";for (x = 0; x < n; x++) {cout << arr[x] << " ";}return 0;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho programu soubor záhlaví iostream.
- Zahrňte do našeho programu std namespace, abyste mohli používat jeho třídy, aniž byste jej volali.
- Zavolejte funkci main (). Logika programu by měla být přidána do těla funkce.
- Deklarujte dvě celočíselné proměnné x a n.
- Vytiskněte na konzoli text, který uživatele vyzve k zadání hodnoty proměnné n.
- Přečíst vstup uživatele z klávesnice a přiřadit jej k proměnné n.
- Deklarujte matici, která pojme celkem n celých čísel a přiřadí ji proměnné ukazatele * arr.
- Vytiskněte zprávu s výzvou k zadání n počtu položek.
- Pomocí smyčky for vytvořte proměnnou smyčky x pro iteraci položek zadaných uživatelem.
- Přečtěte si prvky zadané uživatelem a uložte je do pole pole.
- Konec těla smyčky for.
- Vytiskněte nějaký text na konzoli.
- Pomocí smyčky for vytvořte smyčkovou proměnnou x k iteraci nad položkami pole.
- Vytiskněte na konzole hodnoty obsažené v poli s názvem arr.
- Konec těla smyčky for.
- Po úspěšném dokončení musí program vrátit hodnotu.
- Konec těla funkce main ().
POZNÁMKA: Ve výše uvedeném příkladu může uživatel během běhu zadat libovolnou velikost pole. To znamená, že velikost pole je určena za běhu .
Inicializace dynamicky přidělených polí
Je snadné inicializovat dynamické pole na 0.
Syntax:
int *array{ new int[length]{} };
Ve výše uvedené syntaxi délka označuje počet prvků, které se mají přidat do pole. Protože musíme inicializovat pole na 0, mělo by to zůstat prázdné.
Můžeme inicializovat dynamické pole pomocí seznamu inicializátorů. Pojďme vytvořit příklad, který to ukazuje.
Příklad 2:
#includeusing namespace std;int main(void) {int x;int *array{ new int[5]{ 10, 7, 15, 3, 11 } };cout << "Array elements: " << endl;for (x = 0; x < 5; x++) {cout << array[x] << endl;}return 0;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho programu soubor záhlaví iostream.
- Zahrňte do našeho programu standardní obor názvů, abyste mohli používat jeho třídy, aniž byste jej volali.
- Zavolejte funkci main (). Logika programu by měla být přidána do těla funkce.
- Deklarujte celočíselnou proměnnou s názvem x.
- Deklarujte dynamické pole s názvem pole pomocí seznamu inicializátorů. Pole pojme 5 celočíselných prvků. Všimněte si, že jsme nepoužili operátor mezi délkou pole a seznamem inicializátoru.
- Vytiskněte nějaký text na konzoli. Endl je klíčové slovo C ++, což znamená koncový řádek. Přesune kurzor na další větu.
- K opakování prvků pole použijte smyčku for.
- Vytiskněte obsah pole s názvem pole na konzoli.
- Konec těla smyčky for.
- Po úspěšném dokončení musí program vrátit hodnotu.
- Konec těla funkce main ().
Změna velikosti polí
Délka dynamického pole se nastavuje během doby přidělování.
C ++ však nemá vestavěný mechanismus změny velikosti pole, jakmile bylo přiděleno.
Tuto výzvu však můžete překonat dynamickým přidělením nového pole, kopírováním přes prvky a poté vymazáním starého pole.
Poznámka: tato technika je náchylná k chybám, proto se jí snažte vyhnout.
Dynamické mazání polí
Dynamické pole by mělo být odstraněno z paměti počítače, jakmile je splněn jeho účel. K tomu vám pomůže prohlášení o odstranění. Uvolněné místo v paměti lze poté použít k uložení další sady dat. I když však neodstraníte dynamické pole z paměti počítače, po ukončení programu bude automaticky odstraněno.
Poznámka:
Chcete-li odstranit dynamické pole z paměti počítače, měli byste místo odstranění použít delete []. [] Dává CPU pokyn k odstranění více proměnných namísto jedné proměnné. Použití odstranění namísto odstranění [] při práci s dynamickým polem může mít za následek problémy. Mezi příklady takových problémů patří úniky paměti, poškození dat, pády atd.
Příklad 3:
#includeusing namespace std;int main() {int x, n;cout << "How many numbers will you type?" << "\n";cin >>n;int *arr = new int(n);cout << "Enter " << n << " numbers" << endl;for (x = 0; x < n; x++) {cin >> arr[x];}cout << "You typed: ";for (x = 0; x < n; x++) {cout << arr[x] << " ";}cout << endl;delete [] arr;return 0;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Zahrňte soubor záhlaví iostream do našeho programu, abyste mohli využívat jeho funkce.
- Zahrňte do našeho programu std namespace, abyste mohli používat jeho třídy, aniž byste jej volali.
- Zavolejte funkci main (). Logika programu by měla být přidána do těla funkce.
- Deklarujte dvě proměnné x a n celočíselného datového typu.
- Vytiskněte nějaký text na konzoli. Text požádá uživatele, aby uvedl počet čísel, která zadá.
- Čtení vstupu uživatele z klávesnice. Vstupní hodnota bude přiřazena proměnné n.
- Deklarovat proměnnou ukazatele * arr. Array pole si vyhradí část paměti pro uložení celkem n celých čísel.
- Na konzole vytiskněte zprávu s výzvou k zadání n čísel.
- Vytvořte smyčku for a smyčku proměnnou x, abyste iterovali nad čísly zadanými uživatelem.
- Přečtěte si čísla zadaná uživatelem a uložte je do pole Arr.
- Konec těla smyčky for.
- Vytiskněte nějaký text na konzoli.
- Použijte smyčku pro a smyčku proměnné x k iteraci obsahu pole Arr.
- Vytiskněte hodnoty pole Arr na konzole.
- Konec těla smyčky for.
- Vytiskněte na konzole prázdný řádek.
- Uvolněte paměť pole Arr.
- Po úspěšném dokončení program vrátí hodnotu.
- Konec těla funkce main ().
Souhrn:
- Pravidelná pole mají pevnou velikost. Jakmile je deklarována jejich velikost, nemůžete je upravit.
- U těchto typů polí se velikost paměti určuje během doby kompilace.
- Dynamická pole se liší. Jejich velikosti lze měnit za běhu.
- V dynamických polích je velikost určena za běhu.
- Dynamická pole v C ++ jsou deklarována pomocí nového klíčového slova.
- V hranatých závorkách určujeme počet položek, které mají být uloženy v dynamickém poli.
- Po dokončení pole můžeme uvolnit paměť pomocí operátoru odstranění.
- Pomocí operátoru odstranění pomocí [] uvolněte paměť všech prvků pole.
- Odstranění bez [] uvolní paměť pouze jednoho prvku.
- Neexistuje žádný integrovaný mechanismus pro změnu velikosti polí C ++.
- K inicializaci pole pomocí inicializátoru seznamu nepoužíváme operátor .