2012-05-06 24 views
5

Nie mogę znaleźć tej informacji. Mam do czynienia z dziwną sytuacją, w której jestem w pętli i mogę uzyskać losową informację w dowolnym momencie. Informacje te muszą być przechowywane w wektorze. Teraz każda klatka muszę ustawić ten wektor, aby upewnić się, że nie będę przekraczał przestrzeni (piszę wartości do losowych punktów w wektorze za pomocą indeksowania).Zmiana rozmiaru wektorowego STL

Zakładając, że nie ma sposobu na zmianę tego fragmentu kodu, chcę wiedzieć, czy wektor "ignoruje" funkcję resize(), jeśli wysyłam argument, który jest dokładnie wielkością wektora? Gdzie mogę znaleźć te informacje?

Odpowiedz

9

Z odniesieniem MSDN 1

Jeśli wielkość kontenera jest mniejsza od żądanej wielkości _Newsize elementy są dodawane do wektora, aż do osiągnięcia żądanej wielkości. Jeśli rozmiar kontenera jest większy niż żądany rozmiar, elementy znajdujące się najbliżej końca kontenera są usuwane, dopóki kontener nie osiągnie rozmiaru _Newsize. Jeżeli obecna wielkość pojemnika jest taka sama jak żądanej wielkości, nie zostaną podjęte działania

ISO C++ standardowy (strona 485 2) określa takie zachowanie za vector::resize

void resize (size_type sz , T c = T()); 

if (sz > size()) 
    insert (end() , sz - size() , c); 
else if (sz < size()) 
    erase (begin()+ sz , end()); 
else 
; // Does nothing 

Więc tak, wektor to ignoruje i nie musisz sam sprawdzać.

0

Kinda-sorta.

Po prostu zmiana rozmiaru wektora z funkcją zmiany rozmiaru() może spowodować, że sam wektor użyje więcej pamięci (zmieni ilość wykorzystaną przez jego elementy). Jeśli w zarezerwowanym miejscu nie ma wystarczającej ilości miejsca, zostanie ono ponownie przydzielone (a czasami lubią się nieco podparć, więc nawet jeśli istnieje wzrost). Jeśli jest już wystarczająco dużo miejsca dla wymaganego rozmiaru i bez względu na to, jakie podszycie chce, nie będzie odrastać.

Gdy specyfikacja mówi, że elementy za końcem rozmiaru zostaną usunięte, oznacza to w miejscu. Zasadniczo wywoła funkcję _M_buff [i]. ~ T() dla każdego usuwanego elementu. W ten sposób każda pamięć twojego obiektu przydzieli zostanie usunięta, przyjmując działający destruktor, ale przestrzeń, którą zajmuje sam obiekt (jego rozmiar) nie będzie. Wektor będzie rósł, będzie rósł i osiągnie maksymalny rozmiar, jaki kiedykolwiek wymyślisz, i nie zmieni się, dopóki istnieje.