¿Hay alguna manera de inicializar una matriz de primitivas, por ejemplo una matriz de enteros, a 0? Sin usar un bucle for? Buscando un código conciso que no involucre un ciclo for.Inicializando matriz primitiva a un valor
:)
¿Hay alguna manera de inicializar una matriz de primitivas, por ejemplo una matriz de enteros, a 0? Sin usar un bucle for? Buscando un código conciso que no involucre un ciclo for.Inicializando matriz primitiva a un valor
:)
int array[10] = {}; // to 0
std::fill(array, array + 10, x); // to x
Nota si desea una forma más genérica para llegar al final:
template <typename T, size_t N>
T* endof(T (&pArray)[N])
{
return &pArray[0] + N;
}
Para obtener:
std::fill(array, endof(array), x); // to x (no explicit size)
Cabe mencionar que std::fill
es solo una envoltura alrededor del ciclo que está tratando de evitar, y = {};
podría implementarse en esos términos.
Suprimí mi respuesta (la tuya solo dice lo mismo pero mucho más clara, ¡y me gusta la solución de plantilla!). Te daría +1 pero estoy sin votos ... otra vez. –
@Billy: Heh, gracias. Tú y tus votos. :) (O falta de eso) – GManNickG
@Billy: lo he votado a favor, le otorgaré la mitad de mi voto si lo desea: p –
Sí, es posible. El método de inicialización depende del contexto.
Si declara una matriz estática o local, utilice = {}
inicializador
int a[100] = {}; // all zeros
Si va a crear una matriz con new[]
, utilice ()
inicializador
int *a = new int[100](); // all zeros
Si va a inicializar un no conjunto de miembros estáticos en la lista de inicializadores del constructor, use el inicializador ()
class C {
int a[100];
C() : a() // all zeros
{
...
}
};
¿Dónde se documenta la inicialización cero? Pensé que una de las cosas en C/C++ con las que NO podías contar era que se inicializaría para nada en absoluto. De hecho, eso es un BENEFICIO de C/C++ sobre Java (a veces), ya que ese lenguaje garantiza que para ciertos tipos, mientras que C/C++ no toma el rendimiento (leve), y le da la memoria "tal como está" . –
@Kevin: ¿Qué quieres decir? Si omite alguno de los inicializadores anteriores, las matrices permanecen sin inicializar. – GManNickG
@Kevin: Te da la memoria "tal como está", a menos que * explícitamente pidas * ceros. Cuando explícitamente usas inicializadores como '= {}' o '()', explícitamente pides inicialización de valor, que se reduce a cero inicialización para tipos básicos. Por ejemplo, si haces 'new int [100]', obtienes memoria "tal cual", pero si haces 'new int [100]()' obtienes ceros. Es ese '()' que marca la diferencia. – AnT
Puede usar memset si quiere que todos sus valores sean cero. Además, si solo está buscando inicializar a cero, puede declarar su matriz de tal manera que se coloque en la sección ZI de la memoria.
Si el número es cero también se podría utilizar memset (aunque esto es más estilo C):
int a[100];
memset(a, 0, sizeof(a));
double A[10] = { value }; // initialize A to value
. No recuerdo si el valor debe compilarse constante o no. no funcionará con matrices automáticas
Hay formas de ocultar lo que está haciendo con diferente sintaxis, y esto es lo que las otras respuestas le dan - std::fill, memset, ={}
etc. En el caso general, sin embargo (excluyendo trucos específicos del compilador como la ZI uno), pensar en lo que hay que hacer por el código compilado:
En otras palabras, hay necesidades a ser un bucle de una manera bastante fundamental.
¿Por qué está intentando evitar un bucle for? Aquí hay diferentes respuestas posibles, y afectan el consejo que podrías obtener. –
Estoy bastante seguro de que este es un duplicado de algo. – GManNickG