アルゴリズムを使用する関数オブジェクトを作成するように教えられています。
operator()
次のようなを呼び出すアルゴリズムがあります。
- for_each
- find_if
- remove_if
- 最大要素
- count_if
これらの関数オブジェクトは通常、unary_function
orから継承して、 function、predicateなどのbinary_function
ように動作する必要があります。
しかし、本は通常、作成の例を示していませんOutputIterators
:
たとえば、 のような関数の出力をトラバースするには
std::set_intersection()
、宛先コンテナーを提供してから、結果をトラバースする必要があります。
std::vector<int> tmp_dest;
std::set_difference (
src1.begin(), src1.end(),
src2.begin(), src2.end(),
std::back_inserter(tmp_dest));
std::for_each( tmp_dest.begin(), tmp_dest.end(), do_something );
int res = std::accumulate( tmp_dest.begin(), tmp_dest.end(), 0 );
ただし、次のように、最初に保存せずに各アルゴリズムの値を使用する方が効率的な場合があると考えてください。
std::set_difference (
src1.begin(), src1.end(),
src2.begin(), src2.end(),
do_something );
Accumulator accumulate(0); // inherits from std::insert_iterator ?
std::set_difference (
src1.begin(), src1.end(),
src2.begin(), src2.end(),
accumulate );
- 通常、このAccumulatorのようなクラスを作成する必要がありますか?
- そのデザインはどのように見えるべきですか?
- 何から継承する必要がありますか?
アキュムレータは から継承でき
insert_iterator
ますが、実際にはイテレータではありません (たとえば、 を実装していませんoperator++()
) 。
広く受け入れられている慣行は何ですか?