7

プリミティブの配列、たとえば整数配列を 0 に初期化する方法はありますか? forループを使わずに?for ループを含まない簡潔なコードを探しています。

:)

4

6 に答える 6

18
int array[10] = {}; // to 0

std::fill(array, array + 10, x); // to x

より一般的な方法で終了する場合は、次のように注意してください。

template <typename T, size_t N>
T* endof(T (&pArray)[N])
{
    return &pArray[0] + N;
}

取得するため:

std::fill(array, endof(array), x); // to x (no explicit size)

言及する必要があるstd::fillのは、回避しようとしているループの単なるラッパーであり= {};、そのような用語で実装される可能性があります。

于 2010-04-12T21:24:01.467 に答える
10

はい、可能です。初期化方法はコンテキストによって異なります。

静的配列またはローカル配列を宣言する場合は、= {}初期化子を使用します

int a[100] = {};  // all zeros

で配列を作成する場合は、初期化子new[]を使用します()

int *a = new int[100](); // all zeros

コンストラクター初期化子リストで非静的メンバー配列を初期化する場合は、初期化子を使用し()ます

class C {
  int a[100];

  C() : a() // all zeros
  {
    ...
  }
};
于 2010-04-12T21:34:01.067 に答える
1

すべての値をゼロにしたい場合は、 memset を使用できます。また、ゼロに初期化するだけの場合は、メモリの ZI セクションに配置されるように配列を宣言できます。

于 2010-04-12T21:34:38.947 に答える
1

数値がゼロの場合は、memset を使用することもできます (ただし、これはより C スタイルです)。

int a[100];
memset(a, 0, sizeof(a));
于 2010-04-12T21:36:04.573 に答える
0

さまざまな構文で何をしているのかを隠す方法があり、これは他の回答が提供するものです-std::fill, memset, ={}など。一般的なケースでは(ZIのようなコンパイラ固有のトリックを除く)、何をする必要があるかを考えてくださいコンパイルされたコードによって:

  • メモリブロック/配列の開始位置を知る必要があります。
  • ブロックの各要素を順番に値に設定する必要があります。
  • ブロックの終わりに達したかどうかを繰り返し確認する必要があります。

言い換えれば、かなり基本的な方法でループが必要です。

于 2010-04-12T22:28:28.593 に答える
0

double A[10] = { value }; // initialize A to value. 値を定数にコンパイルする必要があるかどうかは覚えていません。自動配列では機能しません

于 2010-04-12T22:15:44.087 に答える