2012-08-15 62 views
6

抽象術語管道是具有破壞性讀取的流/ FIFO類型容器。它有一個read()方法可以一次複製數據塊,並且對於單個字節的功能類似getput。當readget返回時,從管道內複製的數據將從管道的內部緩衝區中移除 - 與文件或任何其他容器類型不同。有沒有像管道一樣工作的C++ STL類?

大多數(所有?)STL容器都不在一個buffer命令提供了類似的read()。是否有一個帶有pop_many()成員的fifo容器類型?

stringstream大約是我能想到的,因爲它保持着一個內部讀指針和未來的讀取將阻塞,直到流再次填補了最近的事情。從API的角度來看,容器是空的,但所消費的數據必須手動垃圾收集。

是否有在C++中,這是否等同容器或流類,或者是它滾你自己的事情(像stringstream的例子)?

+4

也許是一個隊列? – Gir 2012-08-15 12:37:50

+2

我可以在queue.pop()中放一個循環,但效率不高。我希望能夠刪除大塊數據,並且在刪除它們之後,隊列/ fifo會自動調整大小。 – 2012-08-15 12:40:20

+2

你需要什麼? – 2012-08-15 12:41:11

回答

1

的意見已經提到std::deque乍一看似乎是您最好的選擇。

如果不爲你工作,有關使用std::list<std::vector<unsigned char> >什麼。你一次只把一個大塊放在一個矢量上,當你彈出時你將它們放到另一個列表中。你必須提供方便包裝代碼量小,這可能是不夠的,如果你想讀一次次載體之一的所有元素。

+0

基本上,API的工作原理是這樣的:用戶在消息的文件描述符上等待,當消息到達時,它們調用Read方法獲取第一個字節以確定消息類型(從而確定消息其餘部分的長度),然後通過周圍的對象和應用程序的各個部分使用Read方法將數據讀入char *緩衝區。所以,現在我正在研究'std :: stringstream',因爲它給了我一個讀(char *,int)方法,並且它會自動遞減一個get指針。它還提供了一個readsome()方法,該方法在應用程序試圖讀取更多數據時不會阻塞。 – 2012-08-15 14:18:20

+0

順便說一句,不是我的API。我永遠不會這樣做! – 2012-08-15 14:18:49

相關問題