在一个问题中有点难以表达,所以我将使用一个例子。假设我愿意:
generate(myvec.begin(), myvec.end(), func())
我可以让func()读取生成的索引吗?这样:
int func()
{
if(index<2)
return 1;
else
return 2;
}
使得CCD_ 1?
简短的回答是"不,不直接"。它可以创建自己的变量,该变量应该与索引一起跟踪,但(在这种情况下)根本无法访问索引本身。
在这种情况下,我几乎肯定只会使用std::fill
两次:
std::fill_n(myVec.begin(), 2, 1);
std::fill(myVec.begin()+2, myVec.end(), 2);
更短、更简单。
是的,如果您使用函数对象作为生成器(正如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);
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);
正如juancapanza在对另一个答案的评论中指出的那样,vec
的元素不能保证以特定的顺序访问。唯一的保证是每个项目都将被访问一次。