2010-04-12 3 views
6

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

:)

+0

Именно поэтому вы пытаетесь избежать цикла for? Здесь есть разные возможные ответы, и они влияют на советы, которые вы можете получить. –

+0

Я уверен, что это дубликат чего-то. – GManNickG

ответ

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

+0

Удалил мой ответ (ваш просто говорит то же самое, но гораздо яснее - и мне нравится шаблонное решение!). Я бы дал вам +1, но у меня нет голосов ... снова. –

+1

@ Билли: Привет, спасибо. Вы и ваши голоса. :) (Или их отсутствие.) – GManNickG

+0

@ Билли: Я поддержал это, я дам вам половину своего голоса, если вы пожелаете: p –

9

Да, это возможно. Метод инициализации зависит от контекста.

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

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

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

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

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

class C { 
    int a[100]; 

    C() : a() // all zeros 
    { 
    ... 
    } 
}; 
+0

Где документация с нулевой инициализацией? Я думал, что одна из вещей в C/C++, на которую вы не могли рассчитывать, это то, что она будет инициализирована чем-либо вообще? На самом деле это BENEFIT C/C++ по сравнению с Java (иногда), поскольку этот язык гарантирует, что для определенных типов, тогда как C/C++ не принимает (незначительный) удар производительности и дает вам память «как есть», , –

+0

@Kevin: Что ты имеешь в виду? Если вы не укажете ни один из инициализаторов выше, массивы остаются неинициализированными. – GManNickG

+0

@Kevin: Это дает вам память «как есть», если вы явно не задаете * для нулей. Когда вы явно используете инициализаторы типа '= {}' или '()', вы явно запрашиваете инициализацию значения, которая сводится к нулевой инициализации для базовых типов. Например, если вы выполняете 'new int [100]', вы получаете память «как есть», но если вы делаете 'new int [100]()', вы получаете нули. Дело в том, что '()' все это имеет значение. – AnT

1

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

1

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

int a[100]; 
memset(a, 0, sizeof(a)); 
0

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

0

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

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

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

Смежные вопросы