Qual è la migliore sostituzione per std::array<...>
se non si desidera fornire la dimensione di constexpr? Ho pensato che sarebbe meglio usare solo std::vector
e fare reserve(...)
su di esso, ma forse sto trascurando qualcosa?Sostituzione di C++ per std :: array
risposta
Sì, utilizzare std::vector
.
Così, se il codice è
std:array<int, 42> my_array;
sostituirlo con
std:vector<int> my_array(42);
Nota: probabilmente non si vuole utilizzare reserve
, perché lascia il vector
vuota. Se si utilizza std::array
, il codice non ha il concetto di matrice vuota, quindi è meglio rappresentato da un'istanza std::vector
riempita in costruzione e mai ridimensionata.
Con un 'std :: vector
Un piccolo problema con questo è che riempie il vettore con zeri, mentre la dichiarazione della matrice nell'esempio lascia non inizializzata. Questo può essere importante se si prevede che il vettore abbia grandi dimensioni. – Ruslan
std::vector
dovrebbe essere il contenitore corretto di scelta, se la dimensione deve essere determinata in fase di esecuzione.
std::vector<>
è probabilmente la risposta. Non voglio proprio presumere che lo reserve()
garantisca qualsiasi aumento di velocità.
Bjarne Stroustrup:
La gente a volte preoccuparsi del costo di std :: vector crescente in modo incrementale. Ero solito preoccuparmi di ciò e ho usato reserve() per ottimizzare la crescita. Dopo aver misurato il mio codice e aver ripetutamente riscontrato problemi di prestazioni di reserve() nei programmi reali , ho smesso di usarlo tranne dove è necessario per evitare l'invalidazione dello iteratore (un caso raro nel mio codice). Ancora: misura prima dello che ottimizzi.
http://www.stroustrup.com/bs_faq2.html [Vedere fondo "Perché i contenitori standard così lento?"]
Direi che nella maggior parte dei casi chiamare 'reserve' non è tanto la garanzia di speedup (il che significherebbe quanto STL" garantisce il rallentamento "quando si omette la chiamata), ma di scegliere la soluzione più corta quando è semplice e ovvio. Spesso sai in tempo di allocazione esattamente quanto diventerà grande il tuo vettore, anche se per qualche motivo non puoi costruirlo a quella dimensione, ma hai bisogno di ripetere 'push_back' per riempirlo. Quindi non chiamare 'reserve' sarebbe sciocco come non uscire da una ricerca lineare quando viene trovata una corrispondenza; certo che l'accelerazione potrebbe essere piccola, ma il miglioramento è ovvio. –
- 1. C++ 11 std :: array
- 2. Considera C cstyle array come std :: array
- 3. C++ 11: corretta l'inizializzazione di std :: array?
- 4. Aliasing rigoroso e array in stile C std :: array vs
- 5. Multidimensional std :: array
- 6. sostituzione per binary_function
- 7. Conversione tra C++ std :: vector e array C senza copiare
- 8. Perché std :: array :: front e std :: array :: back non noexcept?
- 9. Decisione di progettazione per il riempimento std :: array
- 10. Differenza tra std :: vector e std :: array di inizializzazione elenca
- 11. Utilizzo di std :: array come attributo per boost :: spirit :: x3
- 12. Su l'inizializzazione di std :: array di
- 13. Stampa di uno std :: array di
- 14. Come funziona l'inizializzatore std :: array per char?
- 15. È std :: array mobile?
- 16. constexpr std :: array con static_assert
- 17. Esiste un equivalente di std :: vector in PHP in C++?
- 18. inizializzazione di std :: array <>
- 19. Sostituzione di realloc (C -> C++)
- 20. Esiste una sintassi particolare per inizializzare un array std :: da un altro std :: array diverso?
- 21. std :: array <char, N> a std :: stringa
- 22. C++ std :: coppia, std :: vector e memcopy
- 23. std :: vector alternativa per C
- 24. Sostituzione per #import in Visual C++
- 25. C++ std :: vettore di indipendente std :: threads
- 26. C compilatore ??) sostituzione
- 27. std :: ricerca di un array di eredità
- 28. modello di argomentazione deduzione/sostituzione fallito, quando si usa la funzione std :: e std :: bind
- 29. chiusura C++ e std :: function
- 30. errore quando si istanzia std :: array utilizzando std :: matrice :: size
C'era una proposta per una dimensione fissa ['std :: dynarray'] (http://en.cppreference.com/w/cpp/container/dynarray). Sfortunatamente non è diventato in C++ 14. – juanchopanza
Perché il comitato ha deciso di non accettarlo? Vedo che è in fase sperimentale, il che significa che probabilmente ha ancora una possibilità. –