【发布时间】:2011-07-24 20:00:01
【问题描述】:
所以,我觉得在 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 中最好的东西看起来可能是一个 stringbuf - 我必须手动配对对 sgetc/pubseekoff 的调用,但它似乎可以工作。
我希望这样做是为了替代当前存在性能问题的队列实现;在这个实现中读取队列中的数据量是 O(N)。 (这是一个非常幼稚的实现——每次出队都会导致队列中剩余数据的数组副本。)
其他要求(如果需要,我可以在包装器中实现这些): -我需要能够指定缓冲区的最大大小 - 如果可用数据少于请求的数据,则读取操作应检索所有可用数据 - 如果请求的写入将超过最大大小并返回失败指示符,则写入操作不应执行任何操作
所以,我的问题: 1) stringbuf 是否足够?假设不需要调整大小,读/写操作是否相对于缓冲区中的数据量 O(1)? (显然,在请求的项目数量上,它们可能是 O(n)。)
2) 是否还有其他我看不到的课程就足够了?
提前致谢!
【问题讨论】:
-
我怀疑,除非您只是通过实现为链表的队列传递指向缓冲区的指针,否则您从不必将数据复制到出列队列中获得的任何好处都将因额外的开销而丢失入队时复制或分配。
-
@Jon:听起来好像问题不是被复制的出队元素,而是整个队列的其余部分向下移动。有很多数据结构比这做得更好。
-
啊,好吧,我没有从 OPs 描述中得到那个。