2013-02-25 6 views
5

私は、CSV形式のファイルを解析するためのイテレータのように動作するクラスを作成しました。 MyObject構造体を直接満たすために、特定のcsvファイルを読み込むための他のクラスも作成しました。したがって、このクラスは、(私は、コードの一部をエラー処理を削除)そのように使用することができます:イテレータを使用してフォーマットされたストリームを読み込むことは良いことですか?

std::ifstream in(filename); 
MyObjectParser parser(in); 
MyObjectParser::Iterator it; 
for (it = parser.begin(); it != parser.end(); it++) 
{ 
    MyObject b = *it; 
    // do some stuff here ... 
} 

プログラムがうまく機能し、私はそれに満足しているが、私は、暗黙的な意味(だけ自分のためにすることを実現しましたか? )はであり、それはコレクションで繰り返されます。この場合、コレクションはなくストリームです。

std::ifstream in(filename); 
MyObjectReader reader(in); 
MyObject obj; 
while(reader >> obj) 
{ 
    // do the same "some stuff" here... 
} 

それは味の問題だけです:

は私が明示的に>>演算子 をオーバーロードので、そのような何かを持っていることによって、私は、ストリームを使用していますお勧めフォームが好むべきでしょうか? 違いは何ですか(2番目のフォームではオブジェクトが塗りつぶされ、コピーされていないことを除いて)、最初のフォームまたは2番目のフォームを選択した場合の結果は何ですか?

なぜ私が別のものではなくソリューションを使用しているのかを正確に知るために、他の意見を聞いてうれしいです。

+0

イテレータは*コレクション*を反復処理する必要がありますか?私は、イテレータがコンテナ、ストリーム(ファイル、ネットワークデータなど)、暗黙の(多分ダミーの)データなど、あらゆる種類のデータ**を反復処理することを理解しています。データ。それを一般的に保つ。 ;)私は個人的にイテレータベースのインターフェイスが好きです。 – leemes

答えて

6

ストリームは必要に応じてコレクションとして扱うことができます。

私はoperator>>をオーバーロードすることで、あなたは両方を持つことができること、しかし、注意したい - あなたは明示的に、直接operator>>を使用してストリームからデータを読み取ることができるかあなたは治療のためにstd::istream_iterator<whatever>を使用して、コレクションとしてストリームを扱うことができますコレクションとして。

その場合、オーバーロードのoperator>>が当然の選択です。その場合、本質的に余分な作業をすることなくどちらかの方法で処理できます。さらに、std::istream_iterator<x>を使用することは、標準ライブラリに含まれているため、かなり分かりやすいイディオムです。

2

反復の概念は、コンテナの概念に依存しません。 イテレータは一連の値を反復処理します。異なる反復子 デザインは異なる方法でシーケンスを定義しますが、現在の値のアイデアは常に であり、進行して終了に達します。 入力イテレータの唯一の問題については、 がファイルの最後に終了することです。たとえば、 の次の10行にはダブルスが含まれているとは言えません。次に に移動します。 (もちろん、最後にストリームを検出するためにstreambufの というフィルタリングを挿入することができます)。

関連する問題