Co to jest tablica dynamiczna?
Tablica dynamiczna jest dość 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 z góry określona ilość pamięci. Tak nie jest w przypadku tablicy dynamicznej, ponieważ zwiększa ona rozmiar swojej pamięci o pewien czynnik, gdy jest taka potrzeba.
W tym samouczku C ++ nauczysz się
- Co to jest tablica dynamiczna?
- Czynniki wpływające na wydajność tablic dynamicznych
- Nowe słowo kluczowe
- Inicjowanie tablic alokowanych dynamicznie
- Zmiana rozmiaru tablic
- Dynamiczne usuwanie tablic
Czynniki wpływające na wydajność tablic dynamicznych
Początkowy rozmiar macierzy i jej współczynnik wzrostu określają jej wydajność. Zwróć uwagę na następujące punkty:
- Jeśli macierz ma mały rozmiar i mały czynnik wzrostu, będzie częściej ponownie przydzielać pamięć. Zmniejszy to wydajność macierzy.
- Jeśli macierz ma duży rozmiar i duży współczynnik wzrostu, będzie miała ogromny fragment nieużywanej pamięci. Z tego powodu operacje zmiany rozmiaru mogą potrwać dłużej. Zmniejszy to wydajność macierzy.
Nowe słowo kluczowe
W C ++ możemy stworzyć tablicę dynamiczną za pomocą słowa kluczowego new. Liczba pozycji do przydzielenia jest określona w parze nawiasów kwadratowych. Nazwa typu powinna poprzedzać to. Żądana liczba pozycji zostanie przydzielona.
Składnia:
Nowe słowo kluczowe ma następującą składnię:
pointer_variable = new data_type;
Pointer_variable to nazwa zmiennej wskaźnika.
Data_type musi być prawidłowym typem danych C ++.
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.
Przykład 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;}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołącz plik nagłówkowy iostream do naszego programu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main (). Logikę programu należy dodać w treści funkcji.
- Zadeklaruj dwie zmienne całkowite x i n.
- Wydrukuj tekst na konsoli, prosząc użytkownika o wpisanie wartości zmiennej n.
- Odczytaj dane wejściowe użytkownika z klawiatury i przypisz je do zmiennej n.
- Zadeklaruj tablicę zawierającą łącznie n liczb całkowitych i przypisz ją do zmiennej wskaźnikowej * arr.
- Wydrukuj komunikat z prośbą o wprowadzenie liczby n pozycji.
- Użyj pętli for, aby utworzyć zmienną pętli x, aby iterować po elementach wprowadzonych przez użytkownika.
- Odczytaj elementy wprowadzone przez użytkownika i zapisz je w tablicy arr.
- Koniec treści pętli for.
- Wydrukuj tekst na konsoli.
- Użyj pętli for, aby utworzyć zmienną pętli x w celu iteracji po elementach tablicy.
- Wydrukuj wartości zawarte w tablicy o nazwie arr na konsoli.
- Koniec treści pętli for.
- Program musi zwrócić wartość po pomyślnym zakończeniu.
- 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 tablic alokowanych dynamicznie
Łatwo jest zainicjować tablicę dynamiczną na 0.
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, pole to powinno pozostać puste.
Możemy zainicjować tablicę dynamiczną za pomocą listy inicjalizującej. Stwórzmy przykład, który to demonstruje.
Przykład 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;}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołącz plik nagłówkowy iostream do naszego programu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main (). Logikę programu należy dodać w treści funkcji.
- Zadeklaruj zmienną całkowitą o nazwie x.
- Zadeklaruj tablicę dynamiczną o nazwie array przy użyciu listy inicjalizującej. Tablica będzie zawierać 5 elementów całkowitych. Zauważ, że nie użyliśmy operatora „=” między długością tablicy a listą inicjalizacyjną.
- Wydrukuj tekst na konsoli. Endl to słowo kluczowe C ++, które oznacza linię końcową. Przenosi kursor do następnego zdania.
- Użyj pętli for do iteracji po elementach tablicy.
- Wydrukuj zawartość tablicy o nazwie array na konsoli.
- Koniec treści pętli for.
- Program musi zwrócić wartość po pomyślnym zakończeniu.
- Koniec treści funkcji main ().
Zmiana rozmiaru tablic
Długość tablicy dynamicznej jest ustawiana w czasie alokacji.
Jednak C ++ nie ma wbudowanego mechanizmu zmiany rozmiaru tablicy po jej przydzieleniu.
Możesz jednak pokonać to wyzwanie, dynamicznie przydzielając nową tablicę, kopiując elementy, a następnie usuwając starą tablicę.
Uwaga: ta technika jest podatna na błędy, dlatego staraj się jej unikać.
Dynamiczne usuwanie tablic
Tablica dynamiczna powinna zostać usunięta z pamięci komputera po spełnieniu jej funkcji. Instrukcja delete może Ci w tym pomóc. Zwolnione miejsce w 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ąć dynamiczną tablicę z pamięci komputera, powinieneś użyć delete [] zamiast delete. [] Nakazuje procesorowi usunięcie wielu zmiennych zamiast jednej zmiennej. Użycie delete zamiast delete [] w przypadku tablic dynamicznych może powodować problemy. Przykładami takich problemów są wycieki pamięci, uszkodzenie danych, awarie itp.
Przykład 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;}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołącz plik nagłówkowy iostream do naszego programu, aby móc korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main (). Logikę programu należy dodać w treści funkcji.
- Zadeklaruj dwie zmienne x i n typu danych typu integer.
- Wydrukuj tekst na konsoli. Tekst poprosi użytkownika o podanie liczby liczb, które wprowadzą.
- Odczytaj dane wejściowe użytkownika z klawiatury. Wartość wejściowa zostanie przypisana do zmiennej n.
- Zadeklaruj zmienną wskaźnikową * arr. Tablica arr zarezerwuje trochę pamięci do przechowywania w sumie n liczb całkowitych.
- Wydrukuj komunikat na konsoli z monitem o wprowadzenie n liczb.
- Utwórz pętlę for i zmienną pętli x, aby iterować po liczbach wprowadzonych przez użytkownika.
- Odczytaj liczby wprowadzone przez użytkownika i zapisz je w tablicy arr.
- Koniec treści pętli for.
- Wydrukuj tekst na konsoli.
- Użyj pętli for i zmiennej pętli x, aby iterować po zawartości tablicy arr.
- Wydrukuj wartości tablicy arr na konsoli.
- Koniec treści pętli for.
- Wydrukuj pusty wiersz na konsoli.
- Zwolnij pamięć tablicy arr.
- Program zwróci wartość, gdy zakończy się pomyślnie.
- Koniec treści funkcji main ().
Podsumowanie:
- Zwykłe tablice mają stały rozmiar. Nie możesz zmienić ich rozmiaru po zadeklarowaniu.
- 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 słowa kluczowego new.
- Używamy nawiasów kwadratowych, aby określić liczbę elementów, które mają być przechowywane w tablicy dynamicznej.
- Po zakończeniu pracy z tablicą możemy zwolnić pamięć za pomocą operatora usuwania.
- Użyj operatora delete z [], aby zwolnić pamięć wszystkich elementów tablicy.
- Usunięcie bez [] zwalnia pamięć tylko jednego elementu.
- Nie ma wbudowanego mechanizmu zmiany rozmiaru tablic C ++.
- Aby zainicjować tablicę przy użyciu inicjatora listy, nie używamy operatora „=”.