C++ Dynamiczna alokacja tablic z przykładem

Co to jest tablica dynamiczna?

Tablica dynamiczna jest bardzo podobna do zwykłej tablicy, ale jej rozmiar można modyfikować w czasie wykonywania programu. Elementy DynamArray zajmują ciągły blok pamięci.

Po utworzeniu tablicy nie można zmienić jej rozmiaru. Jednak tablica dynamiczna jest inna. Tablica dynamiczna może zwiększyć swój rozmiar nawet po jej wypełnieniu.

Podczas tworzenia tablicy przydzielana jest jej z góry określona ilość pamięci. Nie dzieje się tak w przypadku tablicy dynamicznej, ponieważ zwiększa ona rozmiar pamięci o określony współczynnik, gdy zajdzie taka potrzeba.

Czynniki wpływające na wydajność tablic dynamicznych

Początkowy rozmiar tablicy i jej współczynnik wzrostu określają jej wydajność. Zwróć uwagę na następujące punkty:

  1. Jeśli tablica ma mały rozmiar i mały współczynnik wzrostu, będzie częściej dokonywać ponownej alokacji pamięci. Zmniejszy to wydajność macierzy.
  2. Jeśli tablica ma duży rozmiar i duży współczynnik wzrostu, będzie miała ogromny kawałek nieużywanej pamięci. Z tego powodu operacje zmiany rozmiaru mogą trwać dłużej. Spowoduje to zmniejszenie wydajności tablicy.

Nowe słowo kluczowe

In C++, możemy utworzyć dynamiczną tablicę używając słowa kluczowego new. Liczba elementów do przydzielenia jest określona w parze nawiasów kwadratowych. Nazwa typu powinna poprzedzać to. Żądana liczba elementów zostanie przydzielona.

Składnia

Nowe słowo kluczowe ma następującą składnię:

pointer_variable = new data_type;

Zmienna_wskaźnikowa to nazwa zmienna wskaźnikowa.

Typ_danych musi być prawidłowy C++ typ danych.

Następnie słowo kluczowe zwraca wskaźnik do pierwszego elementu. Po utworzeniu tablicy dynamicznej możemy ją usunąć za pomocą słowa kluczowego Delete.

1 przykład:

#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;
}

Wyjście:

Nowe słowo kluczowe

Oto zrzut ekranu kodu:

Nowe słowo kluczowe

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do naszego programu, aby go użyć Funkcje.
  2. Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
  3. Wywołaj funkcję main(). Logikę programu należy dodać w treści funkcji.
  4. Zadeklaruj dwie zmienne całkowite x i n.
  5. Wydrukuj na konsoli tekst zachęcający użytkownika do wprowadzenia wartości zmiennej n.
  6. Odczytaj dane wprowadzone przez użytkownika z klawiatury i przypisz je do zmiennej n.
  7. Zadeklaruj tablicę zawierającą w sumie n liczb całkowitych i przypisz ją do zmiennej wskaźnikowej *arr.
  8. Wydrukuj komunikat proszący użytkownika o wprowadzenie n liczby elementów.
  9. Użyj pętli for, aby utworzyć zmienną pętli x w celu iteracji po elementach wprowadzonych przez użytkownika.
  10. Odczytaj elementy wprowadzone przez użytkownika i zapisz je w tablicy arr.
  11. Koniec korpusu dla pętli.
  12. Wydrukuj tekst na konsoli.
  13. Użyj pętli for, aby utworzyć zmienną pętli x w celu iteracji po elementach tablicy.
  14. Wydrukuj na konsoli wartości zawarte w tablicy o nazwie arr.
  15. Koniec treści pętli for.
  16. Program musi zwrócić wartość po pomyślnym zakończeniu.
  17. Koniec treści funkcji main().

UWAGA: W powyższym przykładzie użytkownik może określić dowolny rozmiar tablicy w czasie wykonywania. Oznacza to, że rozmiar tablicy jest określany w czasie wykonywania.

Inicjowanie dynamicznie przydzielanych tablic

Zainicjowanie tablicy dynamicznej na 0 jest łatwe.

Składnia:

int *array{ new int[length]{} };

W powyższej składni długość oznacza liczbę elementów, które mają zostać dodane do tablicy. Ponieważ musimy zainicjować tablicę na 0, należy pozostawić to pole puste.

Możemy zainicjować tablicę dynamiczną za pomocą listy inicjatorów. Stwórzmy przykład, który to zademonstruje.

2 przykład:

#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;
}

Wyjście:

Inicjowanie dynamicznie przydzielanych tablic

Oto zrzut ekranu kodu:

Inicjowanie dynamicznie przydzielanych tablic

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do naszego programu, aby móc korzystać z jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
  3. Wywołaj funkcję main(). Logikę programu należy dodać w treści funkcji.
  4. Zadeklaruj zmienną całkowitą o nazwie x.
  5. Zadeklaruj dynamiczną tablicę o nazwie array przy użyciu listy inicjatorów. Tablica będzie zawierać 5 elementów całkowitych. Zwróć uwagę, że nie użyliśmy operatora „=” między długością tablicy a listą inicjatorów.
  6. Wydrukuj tekst na konsoli. Koniec jest a C++ słowo kluczowe oznaczające linię końcową. Przesuwa kursor do następnego zdania.
  7. Użyj pętli for do iteracji po elementach tablicy.
  8. Wydrukuj na konsoli zawartość tablicy o nazwie array.
  9. Koniec treści pętli for.
  10. Program musi zwrócić wartość po pomyślnym zakończeniu.
  11. Koniec treści funkcji main().

Zmiana rozmiaru tablic

Długość tablicy dynamicznej jest ustawiana w czasie alokacji.

Jednakże, C++ nie ma wbudowanego mechanizmu zmiany rozmiaru tablicy po jej przydzieleniu.

Można jednak pokonać to wyzwanie, dynamicznie alokując nową tablicę, kopiując elementy, a następnie usuwając starą tablicę.

Uwaga: technika ta jest podatna na błędy, dlatego staraj się jej unikać.

Dynamiczne usuwanie tablic

Tablicę dynamiczną należy usunąć z pamięci komputera po spełnieniu swojego celu. Instrukcja usuwania może Ci w tym pomóc. Zwolnioną przestrzeń pamięci można następnie wykorzystać do przechowywania innego zestawu danych. Jednak nawet jeśli nie usuniesz tablicy dynamicznej z pamięci komputera, zostanie ona automatycznie usunięta po zakończeniu działania programu.

Uwaga:

Aby usunąć tablicę dynamiczną z pamięci komputera, zamiast usuwania należy użyć polecenia Delete[]. [] instruuje procesor, aby usunął wiele zmiennych, a nie jedną zmienną. Użycie polecenia usuwania zamiast usuwania [] w przypadku tablicy dynamicznej może powodować problemy. Przykładami takich problemów są wycieki pamięci, uszkodzenie danych, awarie itp.

3 przykład:

#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;
}

Wyjście:

Dynamiczne usuwanie tablic

Oto zrzut ekranu kodu:

Dynamiczne usuwanie tablic

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream do naszego programu, aby móc korzystać z jego funkcji.
  2. Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
  3. Wywołaj funkcję main(). Logikę programu należy dodać w treści funkcji.
  4. Zadeklaruj dwie zmienne x i n typu danych integer.
  5. Wydrukuj tekst na konsoli. Tekst poprosi użytkownika o podanie liczby liczb, które wprowadzi.
  6. Odczytaj dane wprowadzone przez użytkownika z klawiatury. Wartość wejściowa zostanie przypisana do zmiennej n.
  7. Zadeklaruj zmienną wskaźnikową *arr. Tablica arr zarezerwuje trochę pamięci do przechowywania w sumie n liczb całkowitych.
  8. Wyświetla na konsoli komunikat proszący użytkownika o wprowadzenie n liczb.
  9. Utwórz pętlę for i zmienną pętli x, aby iterować liczby wprowadzone przez użytkownika.
  10. Odczytaj liczby wprowadzone przez użytkownika i zapisz je w tablicy arr.
  11. Koniec treści pętli for.
  12. Wydrukuj tekst na konsoli.
  13. Użyj pętli for i zmiennej pętli x, aby wykonać iterację po zawartości tablicy arr.
  14. Wydrukuj wartości tablicy arr na konsoli.
  15. Koniec treści pętli for.
  16. Wydrukuj pustą linię na konsoli.
  17. Zwolnij pamięć tablicy arr.
  18. Program zwróci wartość po pomyślnym zakończeniu.
  19. Koniec treści funkcji main().

Podsumowanie

  • Zwykłe tablice mają stały rozmiar. Po zadeklarowaniu nie można modyfikować ich rozmiaru.
  • W przypadku tablic tego typu rozmiar pamięci jest określany w czasie kompilacji.
  • Tablice dynamiczne są różne. Ich rozmiary można zmieniać w trakcie działania.
  • W tablicach dynamicznych rozmiar jest określany w czasie wykonywania.
  • Tablice dynamiczne w C++ są deklarowane przy użyciu nowego słowa kluczowego.
  • Do określenia liczby elementów, które mają zostać zapisane w tablicy dynamicznej, używamy nawiasów kwadratowych.
  • Po zakończeniu pracy z tablicą możemy zwolnić pamięć, korzystając z operatora usuwania.
  • Użyj operatora usuwania z [], aby zwolnić pamięć wszystkich elementów tablicy.
  • Usunięcie bez [] zwalnia pamięć tylko jednego elementu.
  • Nie ma wbudowanego mechanizmu zmiany rozmiaru C++ tablice.
  • Aby zainicjować tablicę za pomocą inicjatora listy, nie używamy operatora „=”.