std::generate
返回void
:
template<typename ForwardIterator, typename Generator>
void generate(ForwardIterator first, ForwardIterator last, Generator gen);
std::for_each
返回Function
:
template<typename InputIterator, typename Function>
Function for_each(InputIterator first, InputIterator last, Function f);
SGI的documentation表明for_each
的结果对于返回算法期间可能发生变异的任何状态非常有用。 generate
不一样吗?这是一种疏忽,还是存在界面差异的理由?
答案 0 :(得分:3)
一个显着的区别是,虽然for_each
对容器内容进行操作,但generate
只是覆盖它。因此传递给generate
的函数对象不能收集有关容器内容的信息,因此之后几乎没有理由返回它(它的最终状态是容器内容的不变量)。
答案 1 :(得分:0)
我怀疑允许在generate
的工作中复制谓词,因此保持内部状态并不总能正常工作。 for_each
实际上只改变谓词的一个实例,然后返回它的副本。
当你经常做的是让谓词存储对外部状态对象的引用,然后在生成完成时检查它。
StateHolder state;
Generator generator(state); // Pass by reference.
std::generate(c.begin(), c.end(), generator);
// Now you can check the state object for whatever you need.