2012-08-15 12 views
6

抽象的な言い方をすれば、パイプは破壊的な読み込みを持つストリーム/ FIFOスタイルのコンテナです。一度にすべてのデータをコピーし、1バイトの場合はgetputのような機能を持つread()メソッドがあります。 readまたはgetが返ってきたときに、パイプからコピーされたデータは、ファイルや他のコンテナタイプとは異なり、パイプの内部バッファから削除されます。パイプのように動作するC++ STLクラスはありますか?

STLコンテナのほとんど(すべて?)は、バッファコマンドに類似のread()を提供しません。 pop_many()メンバーのfifoコンテナタイプはありますか?

stringstreamは、内部読み込みポインタを保持しているため、ストリームがいっぱいになるまで将来の読み込みがブロックされるため、私が考えることができる最も近いものです。コンテナはAPIの観点からは空ですが、消費されたデータは手動でガベージコレクションする必要があります。

これを実行するC++に相当するコンテナまたはストリームクラスがありますか?それとも、ストリングストリームの例のようなロールオーダーの問題ですか?

+4

多分キューですか? – Gir

+2

私はqueue.pop()の周りにループを置くことができますが、効率的ではありません。大量のデータを削除できるようにしたいのですが、削除したキュー/ FIFOは自動的にサイズ変更されます。 –

+2

何が必要ですか? –

答えて

1

コメントはすでにstd::dequeを一見一番うまく選択していると言われています。

これがうまくいかない場合は、std::list<std::vector<unsigned char> >を使用するとどうなりますか?一度に1つのベクトルにチャンクを入れ、ポップアップ時にspliceを別のリストに入れます。少量のコンビニエンスラッパーコードを提供する必要があります。のサブベクトルのすべての要素を一度に読み取る必要がない場合は、これでは不十分です。

+0

基本的に、APIは次のように動作します。ユーザーがメッセージのファイル記述子を待機し、メッセージが到着したときにReadメソッドを呼び出してメッセージの種類(したがってメッセージの残りの長さ)を決定する最初のバイトを取得し、周囲のオブジェクトやアプリケーションのさまざまな部分が、Readメソッドを使用してデータをchar *バッファに読み込みます。ですから、今のところ私は 'std :: stringstream'を見ています。なぜなら、それは私にread(char *、int)メソッドを与え、自動的にgetポインタを減らします。また、アプリケーションがより多くのデータを読み込もうとするとブロックしない、readsome()メソッドも用意されています。 –

+0

BTW、私のAPIではありません。私はこのように決してしません! –

関連する問題