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::vectorto 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ówv.empty()– czy pustyv.clear()– usuwa wszystkie elementyv.resize(n)– zmienia rozmiar wektorav.front()– pierwszy elementv.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.