gpt4 book ai didi

C++:使用高效获取/放置多个元素的队列?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:52 25 4
gpt4 key购买 nike

所以,我觉得 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) 是否有其他一些我没有看到的类就足够了?

提前致谢!

最佳答案

嗯……你有没有尝试过显而易见的:

class queue { 
std::deque<unsigned char> data;
public:
int enqueue(unsigned char *array, int bytesToWrite) {
data.insert(data.end(), array, array+bytesToWrite);
}

int dequeue(unsigned char *array, int bytesToRead) {
std::copy(data.begin(), data.begin()+bytesToRead, array);
// or, for C++11: std::copy_n(data.begin(), bytesToRead, array);

data.erase(data.begin(), data.begin()+bytesToRead);
}
};

抱歉,我目前感觉还不够雄心壮志,无法添加您要求的锁定和返回值,但这两者都不应该非常困难。但是,我不想摆弄您的返回值,而是更改接口(interface)以使用迭代器(或者,如果您真的坚持,对 vector 的引用)。

这保证与插入/删除的元素数量成线性关系。

关于C++:使用高效获取/放置多个元素的队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5465332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com