有没有一个类似管道的C++ STL类?

6
在抽象术语中,管道是一个具有破坏性读取的流/先进先出(FIFO)样式容器。它具有一个read()方法,一次性复制数据块,并且有像getput这样的单字节函数。但是当readget返回时,从管道内部缓冲区复制出来的数据将从管道中删除,这与文件或任何其他容器类型不同。
大多数(全部?)STL容器都不提供类似于向缓冲区读取数据的read()命令。是否有具有pop_many()成员的FIFO容器类型? stringstream是我能想到的最接近的东西,因为它维护一个内部读指针,并且将来的读取将阻塞,直到流再次填满。从API的角度来看,容器是空的,但是消耗的数据必须手动进行垃圾回收。
在C++中是否有等效的容器或流类执行此操作,还是需要自己编写代码(如stringstream示例)?

2
我可以在queue.pop()周围放一个循环,但这不是高效的。我想能够删除大块数据,并且在我删除它们后,队列/先进先出自动调整大小。 - Mr Stinky
2
你需要它做什么? - Maxim Egorushkin
我正在将一个类从使用管道转换为使用POSIX消息队列。该API提供了类似于流的读/写接口。我想在底层放置一个队列,但保留在顶部进行读/写的能力。我可以很容易地使用简单的char buffer[];来实现这一点,但我想知道C++ STL是否已经在标准库中有了类似的东西。 - Mr Stinky
std::deque 似乎最符合您的需求。但是,如果支持容器是 deque,那么 queue.pop() 上的循环并不会非常低效。它的调整大小操作并不昂贵。 - Benjamin Lindley
3
std::copy(deque.begin(), deque.begin() + N, destination) 可以翻译成:将 deque 容器中起始位置到前 N 个元素拷贝到目标容器 destination 中。 - Benjamin Lindley
显示剩余2条评论
1个回答

2

评论中已经提到了std::deque,乍一看似乎是您最好的选择。

如果这对您不起作用,那么使用std::list<std::vector<unsigned char> >怎么样?您一次将块放在一个向量上,然后在弹出时将它们从一个列表中splice出来。您需要提供少量的便利包装代码,如果您不想一次读取一个子向量的所有元素,则这可能不足够。


基本上这个API的工作原理是这样的:用户在文件描述符上等待消息,当消息到达时,他们调用Read方法获取第一个字节以确定消息类型(从而确定剩余消息的长度),然后传递对象并且应用程序的各个部分使用Read方法将数据读入char *缓冲区。所以,现在我正在查看std::stringstream,因为它给我提供了一个read(char *, int)方法,并且它自动递减了一个get指针。它还提供了一个readsome()方法,如果应用程序尝试读取更多数据,则不会阻塞。 - Mr Stinky
顺便说一句,这不是我的API。我永远不会这样做! - Mr Stinky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接