为什么std :: generate的返回状态与std :: for_each类似?

时间:2011-08-15 19:22:07

标签: c++ stl

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不一样吗?这是一种疏忽,还是存在界面差异的理由?

2 个答案:

答案 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.