5

CSV形式のファイルを解析するイテレータのように機能するクラスを作成しました。また、特定のcsvファイルを読み取ってMyObject構造を直接埋めるために、他のクラスを作成しました。したがって、クラスは次のように使用できます(コードのエラー処理部分を削除しました)。

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番目のフォームを選択した結果はどうなるかがはっきりとわかりません。

私が別のソリューションではなくソリューションを使用している理由を正確に知るために、他の意見を聞いていただければ幸いです。

4

2 に答える 2

6

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

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

そういうわけで、オーバーロードが当然の選択であるように私には思えoperator>>ます。それ以来、本質的に余分な作業なしでどちらの方法でも物事を扱うことができるからです。さらに、usingstd::istream_iterator<x>は標準ライブラリに含まれているため、かなり認識できるイディオムです。

于 2013-02-25T15:49:27.930 に答える
2

反復の概念は、コンテナーの概念に依存しません。イテレータは一連の値を反復処理します。さまざまなイテレータ設計がさまざまな方法でシーケンスを定義しますが、現在の価値、進歩、そして終わりに到達するという考えは常にあります。入力イテレータの唯一の問題は、ファイルの終わりでしか終了しないことです。たとえば、次の10行にdoubleが含まれているとは言えません。その後、別の行に進みます。(ただし、もちろん、ストリームにフィルタリングstreambufを挿入して、終了を検出することもできます。)

于 2013-02-25T16:05:10.333 に答える