2016-06-16 71 views
8

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

+3

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

+0

Perché il comitato ha deciso di non accettarlo? Vedo che è in fase sperimentale, il che significa che probabilmente ha ancora una possibilità. –

risposta

7

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.

+1

Con un 'std :: vector ', potrei usare 'ridimensiona (42)' invece di specificare una capacità iniziale. Con 'my_array (42)', sarei preoccupato per le persone che pensano che '42' sia un elemento iniziale, o addirittura lo cambi in' my_array {42} 'e rompa silenziosamente le cose. – user2357112

+0

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

17

std::vector dovrebbe essere il contenitore corretto di scelta, se la dimensione deve essere determinata in fase di esecuzione.

4

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

+0

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

Problemi correlati