Wektory w C++ nie pozwalają bezpośrednio na zmniejszenie ich pojemności (capacity) po usunięciu elementów ze środka. Aby osiągnąć efekt "skrócenia" wektora, należy połączyć kilka metod. Oto szczegółowe podejście:
1. Usunięcie elementów ze środka Najpierw należy usunąć niepotrzebne elementy, np. za pomocą `erase()`:
vec.erase(vec.begin() + indeks_poczatkowy, vec.begin() + indeks_koncowy);
2. Zmiana rozmiaru (size) Po usunięciu elementów, wektor może nadal mieć większą pojemność niż rzeczywisty rozmiar. Aby to naprawić, użyj `resize()`:
vec.resize(nowy_rozmiar);
3. Zmniejszenie pojemności (capacity) Jeśli korzystasz z C++11 lub nowszego, wywołaj:
vec.shrink_to_fit();
Dla starszych wersji standardu (C++03 lub wcześniejszych), wykorzystaj trick z `swap`:
std::vector<T>(vec).swap(vec);
Uwaga: W tym przypadku `T` to typ elementów wektora (np. `int`, `std::string` itp.).
Czy to działa jak oczekiwano? - `shrink_to_fit()` to
prośba, nie gwarancja. Implementacja może ją zignorować.
- `swap` zawsze działa, ale wymaga kopii wektora, co może być kosztowne dla dużych danych.
- Usuwanie elementów ze środka nie zmienia pojemności – to kroki 2 i 3 są kluczowe.
Przykład kompletny Załóżmy, że chcemy usunąć 3 elementy z pozycji 2-4 i zmniejszyć pojemność:
vec.erase(vec.begin()+2, vec.begin()+5);
vec.resize(vec.size() - 3); // opcjonalne, jeśli nie chcesz modyfikować size
vec.shrink_to_fit(); // lub std::vector<T>(vec).swap(vec);