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::fill2 回使用します。

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特定の順序でアクセスされるとは限りません。唯一の保証は、すべての項目が 1 回だけアクセスされることです。

于 2013-02-12T00:11:27.660 に答える