2010-08-10 17 views
10

Szukam typu danych C++ podobnego do std::vector, ale bez narzutu związanego z dynamiczną zmianą rozmiaru. Rozmiar pojemnika pozostanie stały przez cały okres jego użytkowania. Rozważałem jednak używanie boost::array, które nie jest odpowiednie, ponieważ wymaga, aby rozmiar tablicy był znany podczas kompilacji, co nie ma miejsca w mojej sytuacji.wektor o stałym rozmiarze

Odpowiedz

15

Zmierz, czy zmiana rozmiaru dynamicznego ma naprawdę wpływ na wydajność przed użyciem czegokolwiek niestandardowego.

Porada: Za pomocą wektora .reserve nigdy nie będzie żadnej alokacji tablicy.

4

Koszt szczytowy wywołany dynamiczną zmianą rozmiaru wynoszący std::vector praktycznie nie istnieje.

Jeśli potrzebna jest tablica o rozmiarze kompilacji, poszukiwanie czegoś bardziej wydajnego niż std::vector byłoby w wielu przypadkach dobrym pomysłem.

Jednak różnica między stałym czasem pracy i dynamicznym czasem wykonywania jest znikoma. std::vector to idealne rozwiązanie w tym przypadku.

2

Użyłem klasy szablonów opartej na pomysłach z STLSoft's auto_buffer (I cobbled razem mojej własnej realizacji z książki Imperfect C++ Matthew Wilsona wraz z niektórych pomysłów z realizacji STLSoft). Przypisuje tablicę domyślnie na stosie (lub osadzonym w obiekcie klasy), jeśli jest wystarczająco mała (na podstawie podanego parametru szablonu). Jeśli alokacja środowiska wykonawczego jest większa, pamięć macierzy pochodzi ze sterty.

http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html

Więc Zaletą tej klasy jest to, że dla mniejszych małych rozmiarów, przydział jest zasadniczo nie-op.

+0

+1 za pokonanie mnie w buforze automatycznym. :) Boost ma jeden [do sprawdzenia] (http://www.boost.org/community/review_schedule.html). – GManNickG

+0

@Zenikoder: 'auto_buffer <>' nie jest częścią STL. –

10

W przypadku ponownego przydzielenia std :: vector nie ma żadnych kosztów związanych z realokacją. Więc albo:

  • konstruowania std :: vector o znanej wielkości na przodzie (std::vector x(100))
  • zapasowego połączenia (n) po zakończeniu budowy, aby upewnić się, że co najmniej n elementów może zostać przesunięta do wektora zanim nastąpi realokacja .
1

Jeśli rozmiar tablicy nie jest znany podczas kompilacji, jedyną opcją w C++ jest tablica przydzielana dynamicznie. Możesz użyć numeru std::vector, aby zagwarantować RAII. Jak powiedzieli inni, fakt zmiany rozmiaru std::vector nie oznacza, że ​​musisz zmienić ich rozmiar. Utwórz std::vector o prawidłowym rozmiarze, a następnie nie wywołuj niczego, co spowoduje jego zmianę.

Powiązane problemy