2010-10-30 10 views

Respuesta

18
bool map[256] = { false }; 

editar: para obtener una referencia de la norma sobre por qué esto es legal, consulte las respuestas a continuación.

+0

Hola Idan, ¿esta es una forma estándar de C++ para inicializar todos los elementos en una matriz? - gracias – q0987

+0

sí, está definido en el estándar (tratando de buscarlo mientras hablamos) –

+0

Lo he buscado, si todavía estás buscando. Ver mi respuesta para el número (s) de párrafo. –

15
bool map[256] = {false}; 

(C++ también permite bool map[256] = {};. Los trabajos anteriores en C también.)

Esto establecerá map[0]-false, y "default-initialize" el resto de 255 miembros (C++ 98 §8.5.1/7: "Si hay menos inicializadores en la lista que miembros en el agregado, entonces cada miembro no inicializado explícitamente se inicializará por defecto"; C 99 §6.7.8/21).

Para bool, "default-inicializar" significa establece en (bool)0, es decir false (C++ 98 §8.5/5; C99 §6.7.8/10).

Tenga en cuenta que este método no funciona si desea inicializar a true.

+0

Solo por mencionar, esto sólo es válido para C++, pero no para C. –

+0

Hola Als, gracias por recordatorio de que C no tiene tipo bool. – q0987

+2

@ q0987: C tiene un tipo booleano desde hace 11 años. Por ejemplo, C# no existía hace 11 años. –

7

De esta manera:

bool map[256] = { 0 }; 

Algunos dicen esto:

bool map[256] = {}; 

Pero para mí que sólo se ve un poco raro.

¿Por qué utilizar "0" en lugar de "falso"? No es un gran problema, pero lo hago porque el inicializador de la matriz se encuentra ajustado al tamaño de la matriz con 0, no con copias del primer elemento. Dado que la inicialización de los elementos 1 a 255 se define en términos del valor "0" (que por supuesto se convierte en false), no veo ningún daño en el elemento 0 que se inicializa con "0" también. Tener un "0" al final de una lista de inicializadores demasiado corta para los tipos escalares me recuerda lo que realmente está pasando.

Específicamente, el estándar define esto en 8.5.1/7 (lista de inicializadores más corta que la matriz), y 8.5/5 (inicializar un valor bool equivale a inicializarlo con el valor 0 convertido a bool).

+0

muy instructivo. - Gracias – q0987

2

En C++, X = {0} es un inicializador de cero universal idiomático. Esta era una característica llevado adelante a partir de C.

bool map[256] = { 0 }; 
+0

Si quieres ser realmente pedante, en C++ construye el primer elemento con '0', y construye el valor de los otros elementos. Para un tipo escalar como 'bool', todo esto equivale a cero inicialización (por lo que es pedantería en este caso), pero para los tipos de clase podría ser diferente. –

3

A falta de una razón para no hacerlo, la mejor opción es probablemente usar un vector:

std::vector<bool> map(256, false); 

vector<bool>, sin embargo, es una especialización que es bastante diferente de lo que podrías esperar Dependiendo de la situación, es posible que prefiera:

std::vector<char> map(256, false); 
Cuestiones relacionadas