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