C++ Dynamická alokace polí s příkladem
Co je dynamické pole?
Dynamické pole je velmi podobné běžnému poli, ale jeho velikost je modifikovatelná během běhu programu. Prvky DynamArray zabírají souvislý blok paměti.
Jakmile je pole vytvořeno, nelze jeho velikost změnit. Dynamické pole je však jiné. Dynamické pole může zvětšit svou velikost i poté, co bylo vyplněno.
Během vytváření pole je mu přiděleno předem stanovené množství paměti. To není případ dynamického pole, protože v případě potřeby zvětšuje velikost paměti o určitý faktor.
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 stále častěji přerozdělovat paměť. Tím se sníží výkon pole.
- Pokud má pole velkou velikost a velký růstový faktor, bude mít obrovský kus nevyužité paměti. Z tohoto důvodu mohou operace změny velikosti trvat déle. Tím se sníží výkon pole.
Nové klíčové slovo
In C++, můžeme vytvořit dynamické pole pomocí klíčového slova new. Počet položek, které mají být přiděleny, je uveden v hranatých závorkách. Tomu by měl předcházet název typu. Požadovaný počet položek bude přidělen.
Syntax
Nové klíčové slovo má následující syntaxi:
pointer_variable = new data_type;
Ukazatel_proměnná je název proměnná ukazatele.
Data_type musí být platný C++ datový typ.
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:
#include<iostream> using 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 kódu:
Vysvětlení kódu:
- Zahrňte hlavičkový soubor iostream do našeho programu, abyste jej mohli používat funkce.
- Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Programová logika 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 nějaký text, který uživatele vyzve k zadání hodnoty proměnné n.
- Přečtěte si uživatelský vstup z klávesnice a přiřaďte jej proměnné n.
- Deklarujte pole tak, aby obsahovalo celkem n celých čísel, a přiřaďte jej proměnné ukazatele *arr.
- Vytiskněte zprávu s výzvou k zadání n počtu položek.
- Pomocí cyklu for vytvořte proměnnou cyklu x pro iteraci položek zadaných uživatelem.
- Přečtěte si prvky zadané uživatelem a uložte je do pole arr.
- Konec těla pro smyčku.
- Vytiskněte nějaký text na konzoli.
- Pomocí cyklu for vytvořte proměnnou cyklu x pro iteraci položek pole.
- Vytiskněte hodnoty obsažené v poli s názvem arr na konzole.
- Konec těla smyčky for.
- Program musí po úspěšném dokončení vrátit hodnotu.
- Konec těla funkce main().
POZNÁMKA: Ve výše uvedeném příkladu může uživatel zadat libovolnou velikost pole během běhu. To znamená, že velikost pole je určena během běhu.
Inicializace dynamicky alokovaných polí
Je snadné inicializovat dynamické pole na 0.
Syntaxe:
int *array{ new int[length]{} };
Ve výše uvedené syntaxi délka označuje počet prvků, které mají být přidány do pole. Protože potřebujeme inicializovat pole na 0, toto by mělo zůstat prázdné.
Dynamické pole můžeme inicializovat pomocí seznamu inicializátorů. Vytvořme příklad, který to demonstruje.
Příklad 2:
#include <iostream> using 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 kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho programu hlavičkový soubor iostream.
- Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Programová logika 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átoru. Pole bude obsahovat 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. Konec je a C++ klíčové slovo, které znamená koncový řádek. Přesune kurzor na další větu.
- K iteraci prvků pole použijte cyklus for.
- Vytiskněte obsah pole s názvem pole na konzole.
- Konec těla smyčky for.
- Program musí po úspěšném dokončení vrátit hodnotu.
- Konec těla funkce main().
Změna velikosti polí
Délka dynamického pole se nastavuje během doby přidělení.
Nicméně, C++ nemá vestavěný mechanismus pro změnu velikosti pole, jakmile bylo přiděleno.
Tento problém však můžete překonat dynamickým přidělením nového pole, zkopírováním prvků a následným 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 vymazáno z paměti počítače, jakmile splní svůj účel. K tomu vám může pomoci příkaz delete. Uvolněný paměťový prostor lze poté použít k uložení další sady dat. I když však dynamické pole z paměti počítače neodstraníte, bude po ukončení programu automaticky smazáno.
Poznámka:
Chcete-li odstranit dynamické pole z paměti počítače, měli byste místo delete použít delete[]. [] dává CPU pokyn k odstranění více proměnných místo jedné proměnné. Použití delete namísto delete[] při práci s dynamickým polem může způsobit problémy. Příklady takových problémů zahrnují úniky paměti, poškození dat, selhání atd.
Příklad 3:
#include<iostream> using 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 kódu:
Vysvětlení kódu:
- Zahrňte hlavičkový soubor iostream do našeho programu, abyste mohli používat jeho funkce.
- Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Programová logika by měla být přidána do těla funkce.
- Deklarujte dvě proměnné x a n datového typu integer.
- Vytiskněte nějaký text na konzoli. Text vyzve uživatele k uvedení počtu čísel, která zadá.
- Čtení uživatelského vstupu z klávesnice. Vstupní hodnota bude přiřazena proměnné n.
- Deklarujte proměnnou ukazatele *arr. Pole arr vyhradí část paměti pro uložení celkem n celých čísel.
- Vytiskněte na konzole zprávu s výzvou k zadání n čísel.
- Vytvořte cyklus for a proměnnou x cyklu pro iteraci čísel zadaných 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 cyklus for a proměnnou x cyklu k iteraci obsahu pole arr.
- Vytiskněte hodnoty pole arr na konzole.
- Konec těla smyčky for.
- Vytiskněte na konzoli prázdný řádek.
- Uvolněte paměť pole arr.
- Po úspěšném dokončení program vrátí hodnotu.
- Konec těla funkce main().
Shrnutí
- Běžná pole mají pevnou velikost. Jakmile deklarujete jejich velikost, nemůžete změnit.
- U těchto typů polí se velikost paměti určuje během kompilace.
- Dynamická pole jsou různá. Jejich velikosti lze během běhu měnit.
- V dynamických polích se velikost určuje za běhu.
- Dynamická pole v C++ jsou deklarovány pomocí klíčového slova new.
- Pomocí hranatých závorek určujeme počet položek, které mají být uloženy v dynamickém poli.
- Po dokončení s polem můžeme uvolnit paměť pomocí operátoru delete.
- Pomocí operátoru delete s [] uvolněte paměť všech prvků pole.
- Smazání bez [] uvolní paměť pouze jednoho prvku.
- Neexistuje žádný vestavěný mechanismus pro změnu velikosti C++ pole.
- K inicializaci pole pomocí inicializátoru seznamu nepoužíváme operátor „=“.