Por lo tanto, creo que debería haber una buena solución incorporada para esto en C++, pero no estoy seguro de qué se trata.C++: ¿Cola con eficiente obtención/colocación de múltiples elementos?
Necesito una cola (idealmente segura para subprocesos, pero puedo envolverla en sincronización si es necesario) que maneja grupos de bytes de manera eficiente, permitiendo lecturas/escrituras de diferentes tamaños.
por lo que la interfaz se ve como p.
//removes the first bytesToRead elements from the front of the queue and places them in array; returns the actual number of bytes dequeued
int dequeue(unsigned char *array, int bytesToRead)
//Adds bytesToWrite elements from array to the end of the queue; does nothing and returns 0 if this would exceed the queue's max size
int enqueue(unsigned char *array, int bytesToWrite)
Puedo escribir uno yo mismo sin demasiada dificultad, pero parece que esto debería ser algo que se hace fácilmente fuera de la plataforma.
Lo mejor en el STL parece que podría ser un stringbuf - Tendría que emparejar llamadas a sgetc/pubseekoff a mano, pero parece que funcionaría.
Estoy buscando hacer esto como un reemplazo inmediato para una implementación de cola actual que es un problema de rendimiento; la lectura en esta implementación es O (N) en la cantidad de datos en la cola. (Es una implementación muy ingenua: cada dequeue da como resultado una copia de matriz de los datos restantes en la cola.)
Requisitos adicionales (puedo implementarlos en un contenedor si es necesario): -Necesito poder especificar un tamaño máximo de la memoria intermedia operaciones -Leer debe recuperar todos los datos disponibles si es menor se dispone de datos que se solicitó operaciones -Escribir debe hacer nada si la escritura solicitada excede el tamaño máximo y devolver un indicador de fallo
Así , mis preguntas: 1) es stringbuf suficiente? ¿Son las operaciones de lectura/escritura O (1) relativas a la cantidad de datos en el búfer, suponiendo que no es necesario cambiar el tamaño? (Obviamente, potencialmente serían O (n) en el número de elementos solicitados).
2) ¿Hay alguna otra clase que no veo que sea suficiente?
¡Gracias de antemano!
Sospecho que a menos que solo esté pasando punteros a almacenamientos intermedios a través de una cola implementada como lista vinculada, cualquier beneficio que obtenga de no tener que copiar datos para dequeue se perderá en la carga adicional de tener que copiar o asignar cuando lo pones en cola –
@Jon: suena como si no estuviese en juego el elemento descaminado que se está copiando, sino que se desplaza por el resto de la cola. Hay muchas estructuras de datos que funcionan mejor que eso. –
Ah, está bien, no lo obtuve de la descripción de OPs. –