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.
Czy rzeczywiście sprawdziłeś pojemność po wywołaniu 'shrink_to_fit'? – juanchopanza
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
dlaczego nie używać tablicy w tym przypadku (jeśli potrzebujesz stałego rozmiaru) – 4pie0