在一个问题中有点难以表达,所以我将使用一个例子。让我们说:
generate(myvec.begin(), myvec.end(), func())
我可以拥有它,以便func()可以读取生成的索引,使得:
int func()
{
if(index<2)
return 1;
else
return 2;
}
这样myvec[0]=1, myvec[1]=1, myvec[2]=2, myvec[3]=2,..., myvec[N]=2
?
答案 0 :(得分:6)
简短的回答是“不,不是直接”。它可以创建自己应该跟踪索引的变量,但是(在这种情况下)只能访问索引本身。
在这种情况下,我几乎肯定只使用std::fill
两次:
std::fill_n(myVec.begin(), 2, 1);
std::fill(myVec.begin()+2, myVec.end(), 2);
更短,更简单。
答案 1 :(得分:3)
是的,如果你使用一个函数对象作为生成器(正如juan所指出的那样,这个解决方案是否能保证按标准运行是值得怀疑的!谨慎行事并使用Jerry的方法。):
class mygenerator {
public:
mygenerator() : hits(0) {}
int operator()() {
hits++;
return (hits <= 2 ? 1 : 2);
}
private:
int hits;
}
...
mygenerator mg1;
std::generate(myvec.begin(), myvec.end(), mg1);
答案 2 :(得分:0)
class funkygen
{
int index;
public:
funkygen()
: index(0)
{ }
int operator()()
{
if(t < 2)
t++;
return t;
}
};
/* other code */
funkygen f;
std::generate(myvec.begin(), myvec.end(), f);
正如juanchopanza在对另一个答案的评论中指出的那样,vec
的元素不能保证以特定的顺序访问。唯一的保证是每个项目只能被访问一次。