This question already has an answer here:
C++ Notes: Array Initialization has a nice list over initialization of arrays. I have a
int array[100] = {-1};
expecting it to be full with -1's but its not, only first value is and the rest are 0's mixed with random values.
The code
int array[100] = {0};
works just fine and sets each element to 0.
What am I missing here.. Can't one initialize it if the value isn't zero ?
2: Is the default initialization (as above ) faster than the usual loop through the whole array and assign a value or does it do the same thing?
The page you linked to already gave the answer to the first part:
There is no built-in way to initialize the entire array to some non-zero value.
As for which is faster, the usual rule applies: "The method that gives the compiler the most freedom is probably faster".
simply tells the compiler "set these 100 ints to zero", which the compiler can optimize freely.
is a lot more specific. It tells the compiler to create an iteration variable
i
, it tells it the order in which the elements should be initialized, and so on. Of course, the compiler is likely to optimize that away, but the point is that here you are overspecifying the problem, forcing the compiler to work harder to get to the same result.Finally, if you want to set the array to a non-zero value, you should (in C++, at least) use
std::fill
:Again, you could do the same with an array, but this is more concise, and gives the compiler more freedom. You're just saying that you want the entire array filled with the value 42. You don't say anything about in which order it should be done, or anything else.
In the C++ programming language V4, Stroustrup recommends using vectors or valarrays over builtin arrays. With valarrary's, when you create them, you can init them to a specific value like:
To initialize an array 7 members long with "7777777".
This is a C++ way of implementing the answer using a C++ data structure instead of a "plain old C" array.
I switched to using the valarray as an attempt in my code to try to use C++'isms v. C'isms....
Using the syntax that you used,
says "set the first element to
-1
and the rest to0
" since all omitted elements are set to0
.In C++, to set them all to
-1
, you can use something likestd::fill_n
(from<algorithm>
):In portable C, you have to roll your own loop. There are compiler-extensions or you can depend on implementation-defined behavior as a shortcut if that's acceptable.
Should be a standard feature but for some reason it's not included in standard C nor C++...
In Fortran you could do:
but it does not have unsigned numbers...
Why can't C/C++ just implement it. Is it really so hard? It's so silly to have to write this manually to achieve the same result...
What if it was an array of 1,000,00 bytes? I'd need to write a script to write it for me, or resort to hacks with assembly/etc. This is nonsense.
It's perfectly portable, there's no reason for it not to be in the language.
Just hack it in like:
One way to hack it in is via preprocessing... (Code below does not cover edge cases, but is written to quickly demonstrate what could be done.)
There is an extension to the gcc compiler which allows the syntax:
This would set all of the elements to -1.
This is known as "Designated Initializers" see here for further information.
Note this isn't implemented for the gcc c++ compiler.
C++11 has another (imperfect) option: