Te dwie funkcje robią bardzo różne rzeczy!
resize()
Metoda (i przechodzącej argumentu konstruktora jest równoważna) będzie wstawić lub usunąć odpowiednią liczbę elementów do wektora, aby podane wielkości (ma opcjonalny drugi argument do określenia ich wartości). Wpłynie to na size()
, iteracja przejdzie przez wszystkie te elementy, push_back wstawi po nich i możesz uzyskać do nich bezpośredni dostęp za pomocą operator[]
.
reserve()
Metoda przydziela tylko pamięć, ale pozostawia niezainicjowanymi. Ma to tylko wpływ capacity()
, ale size()
pozostanie niezmienione. Nie ma wartości dla obiektów, ponieważ nic nie jest dodawane do wektora. Jeśli następnie wstawisz elementy, ponowna alokacja nie nastąpi, ponieważ została wykonana z góry, ale to jedyny efekt.
Więc to zależy od tego, czego chcesz. Jeśli chcesz mieć tablicę 1000 domyślnych elementów, użyj resize()
. Jeśli chcesz mieć tablicę, do której chcesz wstawić 1000 elementów i chcesz uniknąć kilku alokacji, użyj reserve()
.
EDYCJA: Komentarz Blastfurnace sprawił, że ponownie przeczytałem pytanie i zdałem sobie sprawę, że w twoim przypadku poprawna odpowiedź to nie przydzielaj wstępnie ręcznie. Po prostu wkładaj elementy na końcu, tak jak potrzebujesz. Wektor będzie automatycznie przydzielić według potrzeb i uczyni go bardziej efektywnie niż ręczny sposób wymienić. Jedynym przypadkiem, w którym reserve()
ma to sens, jest dość precyzyjne oszacowanie całkowitego rozmiaru, którego potrzebujesz, łatwo dostępne z wyprzedzeniem.
EDIT2: Edycja pytania reklamowego: jeśli masz wstępne oszacowanie, to reserve()
oszacowanie. Jeśli okaże się to niewystarczające, po prostu pozwól wektorowi zrobić swoje.
std::vector
.