2011-04-05 13 views
6

Estoy consumiendo una aplicación que necesita almacenar un máximo de 100 objetos en una lista para alimentar a una devolución de llamada para su procesamiento, ya que será redundante conservar los datos antiguos si el consumidor no se pone al día. A medida que se reciben nuevos datos, simplemente puede sobrescribir el elemento más antiguo.¿Qué contenedor de STL C++ usar para una lista de tamaño fijo?

Estaba pensando en usar un contenedor circular de memoria intermedia y supuse que sería deque, pero me encontré con que no usa la lista circular, y tampoco tiene la opción de establecer un tamaño máximo fijo.

Hay un método max_size en dequeue, pero la documentación dice "Este es el tamaño potencial máximo que el contenedor puede alcanzar debido a las limitaciones de implementación del sistema o de la biblioteca".

¿Hay algún otro contenedor que pueda usar?

PS: Estoy utilizando Visual C++ 2010 Express

Respuesta

15

No hay contenedores biblioteca estándar que hace lo que desea directamente. Sin embargo, debería echar un vistazo al Boost's Circular Buffer Container. Si no puede usar Boost, al menos puede ver su fuente y rehacerla.

+1

-1, la pregunta pregunta sobre STL – ThomasMcLeod

+19

@Thomas: Y explícitamente dije que no hay nada allí y sugerí una alternativa. ¿Qué preferirías, sin respuesta? – GManNickG

+1

@Gman, sin intención de ofender. Simplemente creo que es inapropiado referirse a Boost cuando hay soluciones basadas en STL bastante simples. Por diversas razones, Boost no es una opción para algunas personas. – ThomasMcLeod

3

Por qué no utilizar un vector con un índice que se incrementa mod 100 cada vez que se añade un nuevo objeto?

#define NUM_ELTS 100 
    template < typename T > 
    class CircularVector 
    { 
    public: 
     CircularVector() : idx(0) 
     { 
      vec = vector<T>(NUM_ELTS); 
     } 
     void push_back(T& elt) 
     { 
      vec[ idx++ % NUM_ELTS ] = elt; 
     } 
    private: 
     int idx; 
     vector<T> vec; 
    }; 

Algo así, de todos modos.

-2

Normalmente hago rodar mis propios búferes circulares con listas vinculadas (supongo que sería el contenedor stl de "lista"). Esto funciona bien a menos que necesites mucho acceso aleatorio a los elementos. Puede escribir una clase que contenga una lista vinculada y mantener el tamaño usted mismo (agregue el elemento al dorso, si el tamaño> umbral {eliminar elemento al frente}, etc.). También puede crear almacenamientos intermedios circulares con matrices/vectores normales al mantener y ajustar los índices de la cabeza y la cola, pero podría estar mejor con el impulso mencionado por GMan.

+1

¿Por qué utilizar una lista vinculada en una matriz contigua? Las desventajas de las listas vinculadas para esto son la carga del asignador, la sobrecarga de memoria y la fragmentación (errores de caché). Al revés, es probable que sea un poco más fácil de autor. –

Cuestiones relacionadas