2

一个问题有点难以表达,所以我将使用一个例子。假设我这样做:

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吗?

4

3 回答 3

6

简短的回答是“不,不直接”。它可以创建自己的变量来跟踪索引,但是(在这种情况下)根本无法访问索引本身。

在这种情况下,我几乎可以肯定只使用std::fill两次:

std::fill_n(myVec.begin(), 2, 1);
std::fill(myVec.begin()+2, myVec.end(), 2);

更短,更简单。

于 2013-02-12T00:15:43.947 回答
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);
于 2013-02-12T00:09:55.230 回答
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不能保证以特定的顺序访问的元素。唯一的保证是每个项目都将被访问一次。

于 2013-02-12T00:11:27.660 回答