我们被教导要创建函数对象来使用算法。
有些算法会调用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 );
- 我们一般应该创建像 Accumulator 这样的类吗?
- 它的设计应该是什么样子的?
- 它应该从哪里继承?Accumulator 可以从
insert_iterator
继承,但它并不真正是一个迭代器(例如它没有实现operator++()
)。
有哪些被广泛接受的做法?
insert_iterator
,它不是插入迭代器,而是一个消耗数据的输出迭代器。 - David Rodríguez - dribeasstd::for_each()
与其他算法不同:虽然其他算法使用谓词,但std::for_each()
使用消费者。 - Dietmar Kühlfind_if
而不是for_each
,并且您将谓词用作消费者,但您也有提前中断迭代的优势。因此,它们实际上都是相同的。 - Grim Fandangostd::for_each()
,有一个要求,即函数对象被移动(如果它是可移动的),即该对象不会被复制,并且可以直接作为消费者工作。我认为这些函数对象之间存在差异。 - Dietmar Kühl