2012-08-15 9 views
6

En términos abstractos, un tubo es un contenedor de estilo de flujo/FIFO con una lectura destructiva. Tiene un método read() que copia trozos de datos a la vez y funciones como get y put para bytes individuales. Sin embargo, cuando regresan read o get, los datos que se copiaron de la tubería se eliminan del búfer interno de la tubería, a diferencia de un archivo o cualquier otro tipo de contenedor.¿Hay una clase C++ STL que funcione como una tubería?

La mayoría (¿todos?) De los contenedores STL no proporcionan un read() similar en un comando de búfer. ¿Hay un tipo de contenedor fifo con un miembro pop_many()?

stringstream es lo más parecido que puedo pensar, ya que mantiene un puntero de lectura interno y las lecturas futuras se bloquearán hasta que la secuencia se llene nuevamente. El contenedor está vacío desde el punto de vista de la API, pero los datos consumidos deberían ser recogidos de forma manual.

¿Hay un contenedor o clase de flujo equivalente en C++ que hace esto, o es una cuestión de rodar por cuenta propia (como en el ejemplo de secuencia de cadenas)?

+4

¿Quizás una cola? – Gir

+2

Podría poner un círculo alrededor de queue.pop(), pero no es eficiente. Quiero poder eliminar grandes cantidades de datos y la cola/fifo cambia el tamaño automáticamente después de eliminarlos. –

+2

¿Para qué lo necesitas? –

Respuesta

1

Los comentarios ya han mencionado std::deque que a primera vista parece ser su mejor opción.

Si eso no funciona para usted, ¿qué tal el uso de un std::list<std::vector<unsigned char> >. Coloca fragmentos en un vector a la vez, y los splice en otra lista cuando está reventando. Tendría que proporcionar una pequeña cantidad de código de envoltura de conveniencia, y esto podría no ser suficiente si no desea leer todos los elementos de uno de los sub-vectores a la vez.

+0

Básicamente la API funciona así: el usuario espera el descriptor de archivo para un mensaje, cuando llega el mensaje llaman a los métodos de lectura para obtener el primer byte y determinar el tipo de mensaje (y luego la longitud del resto del mensaje). el objeto alrededor y varias partes de la aplicación utilizan el método Read para leer los datos en un búfer char *. Entonces, por ahora, estoy mirando 'std :: stringstream' porque me da un método de lectura (char *, int), y automáticamente disminuye un puntero de obtención. También proporciona un método readsome() que no se bloquea si la aplicación intenta leer más datos. –

+0

BTW, no es mi API. ¡Nunca lo haría de esta manera! –

Cuestiones relacionadas