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
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.
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.
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.
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 .
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ę.
- 1. Utwórz nowy wektor o stałym rozmiarze
- 2. Tworzenie obszaru tekstowego bootstrap o stałym rozmiarze
- 3. Jednoczesne Mapa ze stałym rozmiarze
- 4. Konwertuj ciąg do tablicy o stałym rozmiarze bajtów w Go
- 5. Obsada wskaźnik do tablicy o stałym rozmiarze w instrukcji return
- 6. Czy można utworzyć okno glutowania o stałym rozmiarze?
- 7. Nie można zmienić rozmiaru QDialog o stałym rozmiarze w Qt?
- 8. Jak przesłać prosty wskaźnik do wielowymiarowej tablicy o stałym rozmiarze?
- 9. Jak utworzyć sformatowany ciąg o stałym rozmiarze w pythonie?
- 10. ImageView o stałym rozmiarze, niezależnie od rozmiaru obrazu
- 11. Optymalnie przekazanie wymiarów tablicy o stałym rozmiarze w julia
- 12. UIButton ze stałym rozmiarze niestandardowym obrazem
- 13. QSplitter z jednym widgetem o stałym rozmiarze i jednym widgetem o zmiennej wielkości?
- 14. Bitset o zmiennym rozmiarze
- 15. jQuery otwarte nowe okno skupione ze stałym rozmiarze
- 16. Utwórz tablicę o stałym rozmiarze i wypełnij domyślną zawartość inną tablicą?
- 17. Optymalny sposób tworzenia puli wątków o stałym rozmiarze w Javie przy użyciu usługi Executors
- 18. Wskaźniki i bufory o stałym rozmiarze mogą być używane tylko w niebezpiecznym kontekście.
- 19. Jak zmienić wysokość obrazu zgodnie z rozmiarem zawartości pod nim, w pojemniku o stałym rozmiarze
- 20. Czy można przekazać tablicę o stałym rozmiarze jako parametr funkcji GLSL?
- 21. Jak ustawić typ użytkownika tablicy bajtowej o stałym rozmiarze w języku C#?
- 22. Używanie próbki() o rozmiarze próbki = 1
- 23. tablica sortowania o rozmiarze n
- 24. std :: array o rozmiarze zero
- 25. Jak utworzyć wektor o rozmiarze zdefiniowanym przez użytkownika, ale bez predefiniowanych wartości?
- 26. .NET znajdź podajnik papieru o rozmiarze
- 27. Python Selenium Wyślij klucze ostrzegające o rozmiarze
- 28. Przydzielanie tablic o tym samym rozmiarze
- 29. Znajdź pliki o rozmiarze w systemie Unix
- 30. CGImage utworzyć miniaturę obrazu o pożądanym rozmiarze
+1 za pokonanie mnie w buforze automatycznym. :) Boost ma jeden [do sprawdzenia] (http://www.boost.org/community/review_schedule.html). – GManNickG
@Zenikoder: 'auto_buffer <>' nie jest częścią STL. –