所以,我觉得在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中最好的东西看起来像它可能是一个stringbuf - 我必须手动配对调用sgetc/pubseekoff,但它似乎会工作。
我正在寻找这样做,作为性能问题的当前队列实现的插入替换;在这个实现中读取的是队列中的数据量的O(N)。 (这是一个非常天真的实现 - 每个出队导致队列中剩余数据的阵列副本。)
附加要求(如果需要,我可以在包装中实现这些要求): - 我需要能够指定缓冲区 - 读取操作的最大大小,如果较少的数据可用比请求 - 写入操作应该做什么,如果所要求的写会超出最大尺寸,并返回一个失败指示
所以应该检索所有可用的数据,我的问题: 1)stringbuf是否足够?假设不需要调整大小,读/写操作O(1)是否与缓冲区中的数据量有关? (显然,他们会潜在地为O(n)上的项数要求。)
2)是否有我没有看到这就够了一些其他类?
在此先感谢!
我怀疑,除非你只是传递指针通过一个链表实现队列,你不必将数据复制到出队将会失去其复制或分配时的额外开销获得任何好处,以缓冲你入选它。 – 2011-03-28 22:19:48
@Jon:听起来好像它不是正在复制的出队元素,而是将整个剩余的队列向下移动。有很多数据结构比这更好。 – 2011-03-28 22:27:26
啊,好的,我没有从OP的描述中得到。 – 2011-03-28 22:29:49