为什么 std::生成类似于 std::for_each 的返回状态?

Why doesn't std::generate return state similar to std::for_each?

本文关键字:std 返回 each 状态 for 类似于 为什么      更新时间:2023-10-16

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的文档表明,for_each的结果对于返回任何可能在算法过程中发生突变的状态是有用的。generate不也是这样吗?这是一种疏忽,还是存在接口差异的基本原理?

一个显著的区别是,for_each对容器内容进行操作,而generate只是覆盖它。因此,传递给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.