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. –
- 1. Wielowymiarowe std :: array
- 2. C++ 11: Prawidłowa inicjalizacja std :: array?
- 3. Drukowanie std :: array
- 4. Dlaczego std :: array :: front i std :: array :: back not noexcept?
- 5. Dołącz do std :: array
- 6. std :: array o rozmiarze zero
- 7. Wymień `std :: vector` z` std :: array`
- 8. Konwersja std :: array na std :: vector
- 9. std :: array <char, N> na std :: string
- 10. initialize std :: array bez kopiowania/przenoszenia elementów
- 11. Czy istnieje zamiennik C++ 11 (lub boost) zamiennik dla InterlockedExchangePointer?
- 12. Decyzja projektowa dotycząca std :: array fill
- 13. Czy istnieje przyczyna zerowej wielkości std :: array w C++ 11?
- 14. Ścisłe aliasing i std :: array vs tablica stylu C
- 15. konwersja System :: array na std :: wektor
- 16. Różnica między std :: vector i std :: array inicjatora wymienia
- 17. foreach w C++ int array
- 18. Traktuj tablicę Cstyle jako std :: array
- 19. Czy istnieje szczególna składnia do inicjowania std :: array z innej, innej std :: array?
- 20. Używanie std :: gromadzą się na dwuwymiarowej std :: array
- 21. Dlaczego zachowanie inicjalizatora listy C++ dla std :: vector i std :: array jest inne?
- 22. Jak przekonwertować std :: array do punktu?
- 23. Czy jest to niezdefiniowane zachowanie std :: array?
- 24. Wyrównanie nawiasów w inicjalizacji std :: array
- 25. Czy istnieje odpowiednik std :: vector C++ w PHP?
- 26. bool array vs bit array w C
- 27. C++ array vs C# ptr speed confusion
- 28. C++ Rewers Array
- 29. C# Array lub Dictionary?
- 30. C# Vectorized Array Addition
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ę. –