Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wektory, czy da sie je skrocic ?

Ostatnio zmodyfikowano 2025-06-04 00:25
Autor Wiadomość
Piciupol
Temat założony przez niniejszego użytkownika
Wektory, czy da sie je skrocic ?
» 2013-02-21 13:18:14
Witam, mam pytanie, czy da sie skrocic dlugosc wektora w c++ ?
Bo oczywiscie wiem jak mozna go dynamicznie rozszerzac, ale czy gdy pozbede sie kilku elementow ze srodka i przesune od pewnego miejsca wszystkie elementy w "lewo" to czy te ktore zostana puste(chwilowo bezuzyteczne) to czy moge skrocic wektor do tej ilosci elementow jaka jest mi potrzebna ?
P-76609
m4tx
» 2013-02-21 13:36:32
Frazy, które należy wpisać w wyszukiwarkę google:
http://www.cplusplus.com/reference/vector/vector/resize/
P-76610
Elaine
» 2013-02-21 16:42:02
Jeśli chodzi o pojemność, a nie rozmiar, to:
C/C++
vector.shrink_to_fit();
Dla mniej aktualnych bibliotek standardowych:
C/C++
std::vector < T >( vector ).swap( vector );
P-76623
termistor
» 2025-06-04 00:25:00
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);
P-182463
« 1 »
  Strona 1 z 1