C ++: Очередь с эффективным получением / отправкой нескольких элементов?

Итак, я чувствую, что для этого должно быть хорошее встроенное решение на C ++, но я не уверен, что это.

Мне нужна очередь (в идеале потокобезопасная, но при необходимости я могу синхронизировать ее самостоятельно), которая эффективно обрабатывает группы байтов, позволяя читать / писать разного размера.

поэтому интерфейс выглядит, например, как

//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)

Я могу написать один без особых трудностей, но похоже, что это должно быть что-то, что легко сделать с полки.

Лучшее в STL выглядит так, как будто это может быть строка строки - я бы чтобы соединить вызовы sgetc / pubseekoff вручную, но похоже, что это сработает.

Я ищу возможность сделать это как замену текущей реализации очереди, которая является проблемой производительности; чтение в этой реализации - O (N) в зависимости от количества данных в очереди. (Это очень наивная реализация - каждое исключение из очереди приводит к массиву копии оставшихся данных в очереди. -Мне нужно указать максимальный размер буфера - Операции чтения должны извлекать все доступные данные, если доступно меньше данных, чем было запрошено -Операции записи ничего не должны делать, если запрошенная запись превысит максимальный размер и вернет индикатор отказа

Итак, мои вопросы: 1) достаточно ли stringbuf? Являются ли операции чтения / записи равными O (1) относительно объема данных в буфере, при условии, что изменение размера не требуется? (очевидно, они потенциально могут быть O (n) по количеству запрошенных элементов.)

2) Есть ли какой-нибудь другой класс, который я не вижу, которого было бы достаточно?

Заранее спасибо!

5
задан Sbodd 28 March 2011 в 21:32
поделиться