2014-09-08 30 views
7

Wygląda na to, że za każdym razem, gdy dodajesz nowy element do std::vector, jeśli nie ma pustych elementów, liczba przydzielonych elementów jest podwojona (przynajmniej w GCC 4.9). Myślę, że robi się to, aby osiągnąć zamortyzowaną złożoność w czasie stałym.std :: przydzielanie wektorów i pamięci

Eg, po uruchomieniu tego kodu:

v.push_back (1); 
v.push_back (2); 
v.push_back (3); 
v.push_back (4); 
v.push_back (5); 

v.shrink_to_fit(); // capacity is 5 now 
v.push_back (6); 

std::cout << v.capacity() << std::endl; 

wyjście jest 10.

W systemach pamięciowych ograniczane, czy jest jakiś sposób, aby temu zapobiec, nawet jeśli jest to kosztem spektaklu rzut karny?

Co więcej, czy możliwe byłoby wskazanie, że powinien on przydzielać tylko określoną liczbę elementów zamiast podwojenia?

Wiem, że mogę zadzwonić pod numer std::vector::reserve() przed dodaniem nowych elementów, ale wydaje mi się, że bałagan w moim przypadku ... Wywołanie std::vector::shrink_to_fit() jest innym podejściem, ale także niewygodnym.

+0

Czy rzeczywiście sprawdziłeś pojemność po wywołaniu 'shrink_to_fit'? – juanchopanza

+5

Aby uniknąć (zmniejszyć) bałagan, możesz napisać własną, bezpłatną funkcję, która pobiera wektor i element do dodania, a następnie 'v.reserve (v.size() + 1)', a następnie 'push_back'. – dlf

+3

dlaczego nie używać tablicy w tym przypadku (jeśli potrzebujesz stałego rozmiaru) – 4pie0

Odpowiedz

5

Nie ma mowy.

Jedyną opcją jest napisanie własnej struktury danych wektorowych i w ten sposób możesz zrobić cokolwiek zechcesz (lub możesz po prostu skopiować implementację biblioteki internet/C++ i zmienić to, czego potrzebujesz i uwzględnić ten nowy wektor w twoim programie).

W rzeczywistości można również użyć tablicy i polecenia realloc.

+0

Jak korzystać z tablicy razem z realloc? –

Powiązane problemy