Tablice dynamiczne i wektory

1. Tablice statyczne – punkt wyjścia

  • Tworzone z ustalonym rozmiarem w czasie kompilacji:
  • Nie można zmienić ich rozmiaru w trakcie działania programu.
  • To ograniczenie prowadzi do korzystania z tablic dynamicznych lub kontenerów STL (np. std::vector).

2. Tablice dynamiczne

Definicja

Tablice dynamiczne to tablice, których rozmiar ustalany jest w czasie działania programu (runtime), a pamięć dla nich przydzielana jest dynamicznie za pomocą operatora new.

Tworzenie

Użycie

Zwolnienie pamięci

Każda tablica dynamiczna musi zostać zwolniona:

Zalety

  • Rozmiar znany w runtime.
  • Przydatne w starszym C++ (przed std::vector).

Wady

  • Brak automatycznego zarządzania pamięcią → łatwo o wycieki (delete[] zapomniane).
  • Brak dodatkowych metod (np. liczenia rozmiaru).
  • Narażenie na błędy typu out-of-bounds (przekroczenie indeksu).

3. Wektory (std::vector)

Definicja

  • std::vector to dynamiczny kontener sekwencyjny z biblioteki STL.
  • Działa podobnie do tablicy, ale jego rozmiar może się automatycznie zmieniać.
  • Zapewnia dodatkowe metody i bezpieczeństwo.

Deklaracja

Dodawanie elementów

Dostęp do elementów

Usuwanie elementów

Iteracja

Metody pomocnicze

  • v.size() – liczba elementów
  • v.empty() – czy pusty
  • v.clear() – usuwa wszystkie elementy
  • v.resize(n) – zmienia rozmiar wektora
  • v.front() – pierwszy element
  • v.back() – ostatni element

4. Różnice: Tablice dynamiczne vs. Wektory

Cecha Tablice dynamiczne (new[]) std::vector
Rozmiar ustalany w runtime, ale nie można zmieniać można dodawać/usuwać elementy
Zarządzanie pamięcią ręczne (new[], delete[]) automatyczne (RAII)
Dostęp do elementów szybki przez indeks szybki przez indeks ([]), bezpieczny (.at())
Funkcjonalność tylko przechowywanie danych dodatkowe metody (push_back, size, clear itd.)
Bezpieczeństwo łatwo o wyciek pamięci, błędy zakresu bezpieczniejsze (ale nadal możliwe błędy przy [])
Zastosowanie starszy styl C++, niskopoziomowe programowanie nowoczesny C++, aplikacje wysokiego poziomu

5. Tablice dynamiczne wielowymiarowe

Dynamiczna tablica 2D wymaga wskaźnika do wskaźnika:

To dość skomplikowane – w praktyce zamiast tego używa się std::vector<vector<int>>.


6. Wektor 2D

  • Wygodniejsze i bezpieczniejsze niż wskaźniki.
  • Automatycznie zwalnia pamięć po wyjściu z zakresu.