Нам учат создавать функциональные объекты для использования алгоритмов.
Существуют алгоритмы, которые вызывают operator()
, например:
- for_each
- find_if
- remove_if
- max_element
- count_if
Эти объекты функций обычно должны наследовать от unary_function
или 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 );
- Должны ли мы вообще создавать такие классы, как этот Аккумулятор?
- Каким должен быть его дизайн?
- На что он должен унаследовать?
Аккумулятор может наследовать от
insert_iterator
, но он не является итератором (например, он не реализуетoperator++()
)
Каковы общепринятые практики?