C++ 为什么';t std::为每个\u生成类似于std::的返回状态?

C++ 为什么';t std::为每个\u生成类似于std::的返回状态?,c++,stl,C++,Stl,std::generate返回void: template<typename ForwardIterator, typename Generator> void generate(ForwardIterator first, ForwardIterator last, Generator gen); SGI的建议是,每个的结果对于返回算法期间可能发生变化的任何状态都是有用的。对于generate,情况不一样吗?这是一个疏忽,还是界面差异的原因?我怀疑这是为了允许谓词在generat

std::generate
返回
void

template<typename ForwardIterator, typename Generator>
void generate(ForwardIterator first, ForwardIterator last, Generator gen);

SGI的建议是,每个的结果对于返回算法期间可能发生变化的任何状态都是有用的。对于
generate
,情况不一样吗?这是一个疏忽,还是界面差异的原因?

我怀疑这是为了允许谓词在
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.

一个显著的区别是,
for_每个
都对容器内容进行操作,
generate
只是覆盖它。因此,传递给
generate
的函数对象不能收集有关容器内容的任何信息,因此以后几乎没有理由返回它(它的最终状态是容器内容不变的)。

谓词不能随意复制;参见Dobbs博士的这篇文章:.
对于每个
都有能力“读取”容器的内容<代码>生成只是覆盖内容;返回任何东西有什么好处?假设我传递了一个随机数生成器来生成。返回RNG的状态将非常有用。True。但这将是容器内容的不变性。
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.