2010-04-12 17 views
6

¿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

:)

+0

¿Por qué está intentando evitar un bucle for? Aquí hay diferentes respuestas posibles, y afectan el consejo que podrías obtener. –

+0

Estoy bastante seguro de que este es un duplicado de algo. – GManNickG

Respuesta

17
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.

+0

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. –

+1

@Billy: Heh, gracias. Tú y tus votos. :) (O falta de eso) – GManNickG

+0

@Billy: lo he votado a favor, le otorgaré la mitad de mi voto si lo desea: p –

9

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 
    { 
    ... 
    } 
}; 
+0

¿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á" . –

+0

@Kevin: ¿Qué quieres decir? Si omite alguno de los inicializadores anteriores, las matrices permanecen sin inicializar. – GManNickG

+0

@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

1

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.

1

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)); 
0

double A[10] = { value }; // initialize A to value. No recuerdo si el valor debe compilarse constante o no. no funcionará con matrices automáticas

0

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:

  • que necesita saber dónde comienza la memoria del bloque de /matriz;
  • necesita establecer cada elemento del bloque en el valor sucesivamente;
  • necesita comprobar repetidamente si se ha alcanzado el final del bloque .

En otras palabras, hay necesidades a ser un bucle de una manera bastante fundamental.

Cuestiones relacionadas