Jak ustawić początkowy rozmiar std :: vector?


132

Mam vector<CustomClass*>i umieszczam dużo elementów w wektorze i potrzebuję szybkiego dostępu, więc nie używam listy. Jak ustawić początkowy rozmiar wektora (np. Na 20 000 miejsc, żeby uniknąć kopiowania przy wstawianiu nowego)?


1
W każdym std::vectorodwołaniu jest do tego konstruktor i dwie funkcje , w zależności od tego, która lepiej odpowiada Twoim potrzebom.
chris

1
Nie możesz uniknąć kopiowania, ustawiając tylko wartość początkową.
juanchopanza

1
Unikaj kopii? Przechowywanie wskaźników jest dość lekkie pod względem kosztów kopiowania.
user7116


1
@Damir, czy miałeś na myśli std::vectortytuł?
Robᵩ

Odpowiedzi:


184
std::vector<CustomClass *> whatever(20000);

lub:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

Pierwsza ustawia rzeczywisty rozmiar tablicy - tj. Czyni ją wektorem 20000 wskaźników. Ten ostatni pozostawia wektor pusty, ale rezerwuje miejsce na 20000 wskaźników, więc możesz wstawić (do) tylu bez konieczności ponownego przydzielania.

Przynajmniej z mojego doświadczenia wynika, że ​​jest dość niezwykłe, aby którykolwiek z nich miał ogromną różnicę w wydajności - ale w niektórych okolicznościach może wpłynąć na poprawność. W szczególności, dopóki nie nastąpi ponowna alokacja, iteratory w wektorze na pewno pozostaną ważne, a po ustawieniu rozmiaru / zarezerwowanej przestrzeni masz gwarancję, że nie będzie żadnych ponownych alokacji, o ile tego nie zrobisz. t zwiększyć rozmiar poza to.


Który z nich byłby bardziej skuteczny w przypadku dużej liczby wstawień / usunięć?
ctor

3
@Loggie: Wątpię, czy byłaby jakakolwiek różnica w wydajności. Przeważnie zmienia sposób, w jaki go używasz - w pierwszym przypadku po prostu kierujesz się do wskaźników, więc coś w rodzaju whatever[10000] = somepointer;, gdzie drugie wymaga od ciebie push_backkażdego dodanego wskaźnika. Przynajmniej jeśli jesteś przyzwyczajony vector, to drugie jest prawdopodobnie prostsze i bardziej naturalne.
Jerry Coffin

Jeśli rozmiar kontenera, z którego jest kopiowany, jest znany, dlaczego nie jest bardziej efektywne (ponowne) rozmiar i kopiowanie zamiast pushing_back?

1
@Cincinnatus: Ponieważ ma wywołanie reserve, które wstępnie przydziela rozmiar pamięci. Teoretycznie ustawienie rozmiaru może być nadal nieznacznie szybsze, ponieważ pozwala uniknąć zwiększania bieżącego rozmiaru za każdym razem, gdy dodajesz element. W rzeczywistości wątpię, abyś mógł to zmierzyć.
Jerry Coffin

1
właściwie, jeśli robisz to na gorącej ścieżce, a kod jest często nazywany, możesz wykonać wiele instrukcji i zaoszczędzić czas.
bayindirh

15

Musisz użyć funkcji rezerwacji, aby ustawić początkowy przydzielony rozmiar lub zrobić to w początkowym konstruktorze.

vector<CustomClass *> content(20000);

lub

vector<CustomClass *> content;
...
content.reserve(20000);

Kiedy tworzysz reserve()elementy, vectorprzeznaczy wystarczająco dużo miejsca na (przynajmniej?) Tyle elementów. Elementy nie istnieją w programie vector, ale pamięć jest gotowa do użycia. To prawdopodobnie przyspieszy, push_back()ponieważ pamięć jest już przydzielona.


Przydzielanie rozmiaru można również podać podczas budowy, przekazując integralną argumentację (np. std::vector<Custom Class*> content(100);)
adelbertc

@kstruct: Tak, ale może być mniej wydajny - o bardzo niewielką wartość.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.