对于std :: generate,可以传递函数使用索引吗?

时间:2013-02-12 00:05:30

标签: c++ vector

在一个问题中有点难以表达,所以我将使用一个例子。让我们说:

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

3 个答案:

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