11

大量のデータを生成するC++11クラスを作成しています。そのデータは現在データベースからのものであり、完全にメモリに収まるわけではありません。通常のSTLイテレータのように動作するイテレータをユーザーに提供したいのですが、それは怠惰になります。もっと正確に言えば、私はそのようなことをすることができるでしょう:

for (auto& item : big_bunch_of_data) {
    do_stuff_with(item);
}

アイテムは各反復でのみデータベースから取得されます。私が正しければ、この新しい構文は

for (stuff::iterator it = big_bunch_of_data.begin();it != big_bunch_of_data.end();it++) {
    do_stuff_with(*it);
}

begin、、endを提供することでoperator++、目的の動作を実現できるということですか?そして、これらの方法は何をすることになっていますか?つまり、物を壊さずに怠惰にすることはできますか?

4

1 に答える 1

12

ほとんど; コンパイラーは、コンテナークラスでメソッドが見つからない場合、開始イテレーターと終了イテレーターを取得するために他のいくつかの場所を調べますbegin。これは、範囲ベースのforループが、メンバーendを持たない配列でどのように機能するかを示しています。また、無料の関数とADLを探し、最終的にはとを探します。そのため、範囲ベースのforループサポートを既存のコンテナーに後付けする機会がたくさんあります。 セクション6.5.4で詳細を説明します。beginendbeginendstd::beginstd::end

他の質問については、イテレータは絶対に怠惰になる可能性があります!良い例は、コンソールからの入力を読み取るときに怠惰std::istream_iteratorなければならないことです。

forループでイテレータを使用するための要件は、セクション24.2.3で説明されている入力イテレータカテゴリを満たす必要があることです。そのカテゴリに必要な操作は、単項、およびインクリメント前とインクリメント後です。!=*++

入力イテレータを作成したことを言語に知らせるには、イテレータが処理するタイプstd::iterator<std::input_iterator_tag, T, void, T *, T &>がどこから継承する必要があります(セクション24.4.3)。T

于 2012-06-27T08:56:21.393 に答える