Co jest najlepszym zamiennikiem std::array<...>
jeśli nie chcę mieć do zapewnienia constexpr rozmiar? Pomyślałem, że najlepiej będzie po prostu użyć std::vector
i zrobić na nim reserve(...)
, ale może coś przeoczyłem?C++ zamiennik std :: array
Odpowiedz
Tak, użyj std::vector
.
Więc jeśli kod jest
std:array<int, 42> my_array;
zastąpić ją
std:vector<int> my_array(42);
Uwaga: prawdopodobnie nie chcesz używać reserve
, ponieważ pozostawia vector
pusty. Jeśli używasz std::array
, twój kod nie ma koncepcji pustej tablicy, więc najlepiej jest reprezentowana przez instancję std::vector
, która jest wypełniana podczas tworzenia i nigdy nie jest zmieniana.
Z 'std :: vector
Mały problem polega na tym, że wypełnia on wektor zerami, podczas gdy deklaracja tablicy w twoim przykładzie pozostawia niezainicjowaną. Może to mieć znaczenie, jeśli wektor ma mieć duży rozmiar. – Ruslan
std::vector
powinien być właściwym pojemnikiem z wyboru, jeśli rozmiar musi zostać określony w czasie pracy.
std::vector<>
to prawdopodobnie odpowiedź. Po prostu nie zakładałbym, że reserve()
gwarantuje jakiekolwiek przyspieszenie.
Bjarne Stroustrup:
Ludzie czasami martwić o koszt std :: vector rosnącej stopniowo. Kiedyś się o to martwiłem i wykorzystałem rezerwę() na , aby zoptymalizować wzrost. Po pomiarze kodu i wielokrotnym problemom ze znalezieniem korzyści z rezerwy() w rzeczywistych programach , przestałem używać go, z wyjątkiem sytuacji, gdy jest to konieczne, aby uniknąć unieważnienia iteratora (rzadki przypadek w moim kodzie). Ponownie: zmierz przed optymalizacją .
http://www.stroustrup.com/bs_faq2.html [Zobacz dno "Dlaczego są standardowe kontenery tak wolno?"]
Powiedziałbym, że w większości przypadków wywoływanie "rezerwy" to nie tyle gwarancja przyspieszenia (co oznaczałoby tyle, ile STL "gwarantuje spowolnienie" przy pominięciu połączenia), ale wybór krótszego rozwiązania, gdy jest to proste i oczywisty. Często w czasie przydziału wiadomo dokładnie, jak duży będzie twój wektor, nawet jeśli z jakiegoś powodu nie możesz go zbudować do tego rozmiaru, ale musisz powtórzyć 'push_back', aby go wypełnić. Wtedy nie nazywając "rezerwy" byłoby tak samo głupie, jak nie wyłamanie się z wyszukiwania liniowego, gdy znaleziono dopasowanie; na pewno przyspieszenie może być niewielkie, ale poprawa jest oczywista. –
Pojawiła się propozycja dla ustalonego rozmiaru ['std :: dynarray'] (http://en.cppreference.com/w/cpp/container/dynarray). Niestety nie dotarło to do C++ 14. – juanchopanza
Dlaczego Komitet zdecydował się go nie akceptować? Widzę, że jest w fazie eksperymentalnej, co oznacza, że prawdopodobnie nadal ma szansę. –