对于std::generate,可以传递函数use index



在一个问题中有点难以表达,所以我将使用一个例子。假设我愿意:

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的元素不能保证以特定的顺序访问。唯一的保证是每个项目都将被访问一次。