Sto cercando un tipo di dati C++ simile a std::vector
ma senza il sovraccarico relativo al ridimensionamento dinamico. La dimensione del contenitore rimarrà costante per tutta la sua durata. Ho preso in considerazione l'utilizzo di boost::array
, tuttavia, che non è appropriato perché richiede la dimensione della matrice da conoscere in fase di compilazione, il che non è il caso nella mia situazione.vettore con dimensione costante
risposta
Misurare se il ridimensionamento dinamico ha realmente un impatto sulle prestazioni prima di utilizzare qualsiasi cosa non standard.
Suggerimento: con vector.reserve non ci sarà mai alcuna riallocazione dell'array.
L'overhead indotto dalla capacità di ridimensionamento dinamico di std::vector
è praticamente inesistente.
Se avevi bisogno di una serie di dimensioni in fase di compilazione, cercare qualcosa di più efficiente di std::vector
sarebbe davvero una buona idea in molti casi.
Ma la differenza tra la dimensione di runtime fissa e la dimensione di runtime dinamica è trascurabile. std::vector
è una soluzione perfetta in questo caso.
Ho usato una classe template basata su idee da STLSoft's auto_buffer
(ho messo insieme la mia implementazione dal libro Imperfect C++ di Matthew Wilson insieme ad alcune idee dall'implementazione STLSoft). Alloca l'array per impostazione predefinita nello stack (o incorporato nell'oggetto classe) se è sufficientemente piccolo (in base a un parametro del modello fornito). Se l'allocazione di runtime è maggiore, la memoria dell'array proviene dall'heap.
http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html
Quindi la cosa bella di questa classe è che per le piccole dimensioni più piccole, l'assegnazione è essenzialmente un no-op.
Non c'è un sovraccarico in riallocazione se non si rialloca std :: vector. Quindi, o:
- costruire lo std :: vector con una dimensione nota in anticipo (
std::vector x(100)
) - riserva chiamata (n) dopo la costruzione per assicurarsi che almeno n elementi possono essere spinti nel vettore prima che si verifichi riallocazione .
Se la dimensione della matrice non è nota al momento della compilazione, l'unica opzione in C++ è una matrice allocata dinamicamente. È possibile utilizzare un std::vector
per garantire RAII. Come altri hanno già detto, il fatto che lo std::vector
s possa essere ridimensionato non significa che sia necessario ridimensionarli. Creare std::vector
con la dimensione corretta, quindi non chiamare nulla che possa ridimensionarlo.
- 1. Vettore a dimensione costante
- 2. Dichiarare un array con una variabile di dimensione non costante
- 3. Come mantenere costante la dimensione di JTextArea?
- 4. tensorflow costante con dimensioni variabili
- 5. Sostituire una parte di un vettore con un altro vettore
- 6. C# generico con costante
- 7. System.arraycopy con lunghezza costante
- 8. Creazione di un vettore di zeri per una dimensione specifica
- 9. Scala - Imposizione della dimensione del vettore al momento della compilazione
- 10. Vettore C++ con puntatore
- 11. ALTER TABLE con valore DEFAULT costante costante programmato
- 12. Inizializzazione un vettore di vettori aventi una dimensione fissa con boost assegnare
- 13. Come trasformare un vettore in frame di dati con dimensione fissa
- 14. Inserimento nel vettore con riferimento ai dati dello stesso vettore
- 15. inizializzazione di un vettore di vettore <doubles> C++
- 16. Array bidimensionale con il vettore
- 17. riserva vettore C++
- 18. Creare un vettore con una lunghezza di esecuzione del vettore originale con la stessa lunghezza del vettore originale
- 19. Convertire vettore riga di vettore colonna in NumPy
- 20. Ottenere la lunghezza costante recuperare la costante di tempo con elenchi immutabili in un contesto di programmazione funzionale
- 21. Inizializza NSArray con dimensione
- 22. Devo cancellare il vettore <string>?
- 23. Operatore condizionale con un valore costante (vero)?
- 24. Specializzazione template C++ con valore costante
- 25. costante fuori campo con intrinseche NEON
- 26. inizializzazione campo diretto con un valore costante
- 27. Strani risultati con confronto valuta/valore costante
- 28. Scala Numeric init con costante 0
- 29. Riutilizzare un vettore in C++
- 30. Trovare un vettore all'interno di un vettore
+1 per picchiarmi al buffer automatico. :) Boost ne ha uno [per la revisione] (http://www.boost.org/community/review_schedule.html). – GManNickG
@Zenikoder: 'auto_buffer <>' non fa parte dell'STL. –