Zwalnianie i alokowanie std::vector

0

Witam

Chce użyć wektora jako atrybut klasy i nie wiem czy trzeba go jakoś ręcznie zwolnić w destruktorze klasy czy klasa przy niszczeniu wywołuje destruktory klas będących jej atrybutami? I jeszce chciałem się dowiedzieć czy jest już w sdt::vector zaimplementowane coż takiego, że alokuje od razu pamięć na np. 1000 elementów (których jeszcze nie ma "pushniętych" do vectora), a dopiero jak nastąpi przepełnienie to znów zwiększy się rozmiar o 1000 czy muszę pisać samemu?

1

Nic nie trzeba usuwać. Przecież to co piszesz to jest podstawowa funkcjonalność vectora.

3

Instead, vector containers may allocate some extra storage to accommodate for possible growth, and thus the container may have an actual capacity greater than the storage strictly needed to contain its elements (i.e., its size). Libraries can implement different strategies for growth to balance between memory usage and reallocations, but in any case, reallocations should only happen at logarithmically growing intervals of size so that the insertion of individual elements at the end of the vector can be provided with amortized constant time complexity (see push_back).

Jak używasz push_back to vector sam zadba o to, żeby zwiększyć rozmiar gdy trzeba. Jak chcesz, żeby zarezerwował np. 1000 bo wiesz, że dokładnie tyle będziesz miał elementów, to użyj reserve. Przy czym należy rozróżnić reserve i resize, po reserve rozmiar się nie zwiększa: size() zwraca tę samą wartość. To jest tylko instrukcja, żeby zwiększać pojemność capacity(), dzięki czemu nie będzie marnował czasu/pamięci.

Generalnie jak nie masz bardzo wygórowanych wymagań co do użycia pamięci to używaj tylko push_back i nie martw się szczegółami.

0

Nie, nie, nie. Mi chodzi o coś w tym stylu. Taki pseudokod:

vector<int> dydy;
dydy.funkcja_ustalajaca_rozmiar_rezerwowanego_bloku( 1000 ); // Ustawia rozmiar bloku

dydy.push_back( 1410 ); 
// I jak zrobie to pushback to nie bedzie musialo alokowac jednego elementu tylko bedzie miało jeszcze wolne miejsce
// Z kazdym wywoleniem push_back vector zmniejszal by atrybut z liczba wolnego miejsca, a jak by wynosil 0 to alokowal by miejsce na kolejne 1000 elementów.
// Tak chce zrobić zeby za kazdym razem nie alokować tylko co 1000 elementów alokować kolejne 1000
0

W dwóch postach podano ci co trzeba zrobić, jak nie rozumiesz odpowiedzi to zacznij od jakiegoś kursu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0