2016-06-16 11 views
8

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

+3

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

+0

Dlaczego Komitet zdecydował się go nie akceptować? Widzę, że jest w fazie eksperymentalnej, co oznacza, że ​​prawdopodobnie nadal ma szansę. –

Odpowiedz

7

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.

+1

Z 'std :: vector ', mogę użyć 'resize (42)' zamiast określenia początkowej pojemności. Z 'my_array (42)', bym się martwił o ludziach myślących "42" jest początkowym elementem, lub nawet zmieniającym go na 'my_array {42}' i cicho łamiącym rzeczy. – user2357112

+0

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

17

std::vector powinien być właściwym pojemnikiem z wyboru, jeśli rozmiar musi zostać określony w czasie pracy.

4

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?"]

+0

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. –