2

36 個の数値をベクトルに初期化する必要がある C++ ゲームを作成しています。ベクトルは初期化子リストで初期化できないため、より高速に初期化するために while ループを作成しました。2 から 10 までの各数字の 4 を押し戻すようにしたいので、fourth という名前の int を使用して、ループの数字が 4 の倍数であるかどうかを確認しています。そうであれば、押し戻された数字を次の番号。ただし、実行するとSIGABRTが発生します。4番の問題だろうけど、取り出したら信号出なかったから。プログラムは次のとおりです。

for (int i; i < 36;) {
    int fourth = 0;
    fourth++;
    fourth%=4;
    vec.push_back(i);
    if (fourth == 0) {
        i++;
    }
}

助けてください!

4

3 に答える 3

5

初期化はしませんi。を使用しfor (int i = 0; i<36;)ます。また、ループ本体の反復ごとに新しい変数forthが割り当てられます。したがって、テストfourth==0は常に生成されfalseます。

2から10までの各数字を4つ押し戻したい

私は最も簡単なアプローチを使用します:

for (int value = 2; value <= 10; ++value)
{
  for (int count = 0; count < 4; ++count)
  {
    vec.push_back(value);
  }
}

私が行う唯一の最適化は、ループに入る前にベクトルの容量が十分であることを確認することです。他の最適化はコンパイラに任せます。私の推測では、内側のループを省略することで得られるものは、頻繁な剰余除算によって失われるということです。

于 2011-05-03T01:08:56.277 に答える
1

i を初期化しておらず、反復ごとに 4 番目をリセットしています。また、あなたのforループ条件では、あなたが望むことをするとは思いません。

私はこれがうまくいくと思います:

int fourth = 0;
for (int i = 2; i<=10;) {
  fourth++;
  fourth%=4;
  vec.push_back(i);
  if (fourth==0) {
     i++;
  }      
}
于 2011-05-03T01:11:38.000 に答える
0

静的配列宣言を作成し、初期化時にその配列をベクターに問題なく渡すことができました。かなりきれいです:


const int initialValues[36] = {0,1,2...,35};
std::vector foo(initialValues);

定数で動作しますが、非const配列では試していません。

于 2011-05-03T02:11:20.410 に答える