2012-04-03 11 views
5

Kiedy zadzwonić std::vector::reserve gdy identyfikator jest typu std::vector<Foo*>reserve(...) nic nie robi:C++: std :: vector :: rezerwa nie zastrzegając przy zawierający wskazówki

std::vector<int*> bar; 
bar.reserve(20); 

//I expect bar.size to return 20... 
std::size_t sz = bar.size(); 
for(std::size_t i = 0; i < sz; ++i) { 
    //Do Stuff to all items! 
} 

Wspomniany for pętla biegnie dokładnie zero razy i bar. size() zwraca zero. Nie pamiętam, czy jest to również prawdą w przypadku wszystkich innych kontenerów STL, ale jeśli tak, to w tym zachowanie dla std :: vector: DLACZEGO?

+1

Oprócz poniższych rzeczy, myślę, że masz również na myśli użycie 'std :: vector :: size_type' zamiast tylko' std :: size_t'. Nie jestem pewien, czy to ma tak duże znaczenie, ale widziałem to jako coś w rodzaju "najlepszych praktyk" dla STL. Można również utworzyć instancję wektorową z parametrem wielkości. Myślę, że 'std :: vector bar (20);' na przykład powinien przydzielić przestrzeń dla 20 liczb całkowitych dla tej tablicy. – ely

+2

Pedantyczny kod typu 'for (std :: vector :: size_type i; i user763305

Odpowiedz

12

.reserve() nie zmienia rozmiaru wektora. Funkcja, której szukasz, to .resize(). reserve() to po prostu optymalizacja. Jeśli masz zamiar dodać kilka rzeczy do wektora jeden po drugim za pomocą funkcji push_back(), to informowanie o tym, ile dodasz za pomocą funkcji reserve(), może sprawić, że kod będzie działał trochę szybciej. Ale samo wywołanie reserve() nie zmienia rozmiaru.

7

reserve zmienia pojemność wektora, a nie rozmiar. Prawdopodobnie chcesz resize

6

vector::reserve() zmienia pojemność z wektorem, a nie jego rozmiar.

capacity to ile pamięci zostało przydzielone wewnętrznie do przechowywania elementów wektora. size to liczba elementów, które faktycznie są w posiadaniu wektora. vector::resize() wpływa na to ostatnie.