Инициализация примитивного массива в одно значение - PullRequest
6 голосов
/ 13 апреля 2010

Есть ли способ инициализировать массив примитивов, скажем, целочисленный массив, равным 0? Без использования цикла? Ищите краткий код, который не включает цикл for.

:)

Ответы [ 6 ]

17 голосов
/ 13 апреля 2010
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 - это просто оболочка цикла, которую вы пытаетесь избежать, и = {}; может быть реализовано в таких терминах.

9 голосов
/ 13 апреля 2010

Да, это возможно. Способ инициализации зависит от контекста.

Если вы объявляете статический или локальный массив, используйте = {} initializer

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

Если вы создаете массив с new[], используйте () initializer

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

Если вы инициализируете нестатический массив элементов в списке инициализатора конструктора, используйте () initializer

class C {
  int a[100];

  C() : a() // all zeros
  {
    ...
  }
};
1 голос
/ 13 апреля 2010

Если число равно нулю, вы также можете использовать memset (хотя это больше в стиле C):

int a[100];
memset(a, 0, sizeof(a));
1 голос
/ 13 апреля 2010

Вы можете использовать memset, если хотите, чтобы все ваши значения были равны нулю. Кроме того, если вы хотите инициализировать только ноль, вы можете объявить свой массив таким образом, чтобы он помещался в раздел памяти ZI.

0 голосов
/ 13 апреля 2010

Есть способы скрыть то, что вы делаете с другим синтаксисом, и это то, что дают вам другие ответы - std::fill, memset, ={} и т. Д. В общем случае, хотя (исключая трюки, характерные для компилятора, такие как ZI), подумайте о том, что нужно сделать скомпилированным кодом:

  • нужно знать где твоя память блок / массив начинается;
  • необходимо установить каждый элемент блок в значение по очереди;
  • необходимо повторно проверить, конец блока достигнут.

Другими словами, нужно, чтобы был циклом в довольно фундаментальной форме.

0 голосов
/ 13 апреля 2010

double A[10] = { value }; // initialize A to value. Я не помню, должно ли значение компилироваться константой или нет. не будет работать с автоматическими массивами

...