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)?
std::vector
tytuł?
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)?
std::vector
tytuł?
Odpowiedzi:
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.
whatever[10000] = somepointer;
, gdzie drugie wymaga od ciebie push_back
każdego dodanego wskaźnika. Przynajmniej jeśli jesteś przyzwyczajony vector
, to drugie jest prawdopodobnie prostsze i bardziej naturalne.
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ć.
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, vector
przeznaczy 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.
std::vector<Custom Class*> content(100);
)
std::vector
odwołaniu jest do tego konstruktor i dwie funkcje , w zależności od tego, która lepiej odpowiada Twoim potrzebom.