在C++标准(std::for_each)的§25.2.4.2中:
template<class InputIterator, class Function> Function
for_each(InputIterator first, InputIterator last, Function f);
Run Code Online (Sandbox Code Playgroud)
效果:将f应用于取消引用[first,last]范围内的每个迭代器的结果, 从第一个开始到最后一个 - 1.
最近我读到如果传递的仿函数是有状态的(有内部副作用),一些STL算法有不确定的行为.我已经将std::generate函数与类似(不太重要)的仿函数一起用于以下内容:
class Gen
{
public:
explicit Gen(int start = 0)
: next(start)
{
}
int operator() ()
{
return next++;
}
private:
int next;
};
Run Code Online (Sandbox Code Playgroud)
这可以安全使用std::generate吗?生成值的顺序是否有保证?
编辑:声明在这里有状态的仿函数和STL:未定义的行为
在一个问题中有点难以表达,所以我将使用一个例子.让我们说:
generate(myvec.begin(), myvec.end(), func())
Run Code Online (Sandbox Code Playgroud)
我可以拥有它,以便func()可以读取生成的索引,使得:
int func()
{
if(index<2)
return 1;
else
return 2;
}
Run Code Online (Sandbox Code Playgroud)
这样的myvec[0]=1, myvec[1]=1, myvec[2]=2, myvec[3]=2,..., myvec[N]=2?