Есть ли способ инициализировать массив примитивов, например целочисленный массив, до 0? Без использования цикла for? Ищете сжатый код, который не включает цикл for.Инициализация примитивного массива до одного значения
:)
Есть ли способ инициализировать массив примитивов, например целочисленный массив, до 0? Без использования цикла for? Ищете сжатый код, который не включает цикл for.Инициализация примитивного массива до одного значения
:)
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
- это всего лишь обертка вокруг цикла, который вы пытаетесь избежать, и = {};
может быть реализован в таких терминах.
Удалил мой ответ (ваш просто говорит то же самое, но гораздо яснее - и мне нравится шаблонное решение!). Я бы дал вам +1, но у меня нет голосов ... снова. –
@ Билли: Привет, спасибо. Вы и ваши голоса. :) (Или их отсутствие.) – GManNickG
@ Билли: Я поддержал это, я дам вам половину своего голоса, если вы пожелаете: p –
Да, это возможно. Метод инициализации зависит от контекста.
Если вы объявляете статический или локальный массив, используйте = {}
инициализатору
int a[100] = {}; // all zeros
Если вы создаете массив с new[]
используйте ()
инициализатору
int *a = new int[100](); // all zeros
Если вы инициализации не- статический член в списке инициализаторов конструктора, используйте ()
инициализатор
class C {
int a[100];
C() : a() // all zeros
{
...
}
};
Где документация с нулевой инициализацией? Я думал, что одна из вещей в C/C++, на которую вы не могли рассчитывать, это то, что она будет инициализирована чем-либо вообще? На самом деле это BENEFIT C/C++ по сравнению с Java (иногда), поскольку этот язык гарантирует, что для определенных типов, тогда как C/C++ не принимает (незначительный) удар производительности и дает вам память «как есть», , –
@Kevin: Что ты имеешь в виду? Если вы не укажете ни один из инициализаторов выше, массивы остаются неинициализированными. – GManNickG
@Kevin: Это дает вам память «как есть», если вы явно не задаете * для нулей. Когда вы явно используете инициализаторы типа '= {}' или '()', вы явно запрашиваете инициализацию значения, которая сводится к нулевой инициализации для базовых типов. Например, если вы выполняете 'new int [100]', вы получаете память «как есть», но если вы делаете 'new int [100]()', вы получаете нули. Дело в том, что '()' все это имеет значение. – AnT
Вы можете использовать memset, если хотите, чтобы все ваши значения были равны нулю. Кроме того, если вы только хотите инициализировать нуль, вы можете объявить свой массив таким образом, чтобы он был помещен в раздел памяти ZI.
Если число равно нулю можно также использовать MemSet (хотя это больше C-стиль):
int a[100];
memset(a, 0, sizeof(a));
double A[10] = { value }; // initialize A to value
. Я не помню, если значение должно быть скомпилировано константой или нет. не будет работать с автоматическими массивами
Есть способы сокрытия того, что вы делаете с другим синтаксисом, и это то, что другие ответы дают вам - std::fill, memset, ={}
и т.д. В общем случае, хотя (за исключение компилятора конкретных трюков, такие как ZI один), подумайте о том, что должно быть сделано скомпилированный код:
Другими словами, нуждается в, чтобы быть петлей довольно фундаментальным способом.
Именно поэтому вы пытаетесь избежать цикла for? Здесь есть разные возможные ответы, и они влияют на советы, которые вы можете получить. –
Я уверен, что это дубликат чего-то. – GManNickG