2010-08-10 12 views
10

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

15

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.

4

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.

2

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.

+0

+1 per picchiarmi al buffer automatico. :) Boost ne ha uno [per la revisione] (http://www.boost.org/community/review_schedule.html). – GManNickG

+0

@Zenikoder: 'auto_buffer <>' non fa parte dell'STL. –

10

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

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.

Problemi correlati