2010-07-14 5 views
6

¿Cómo escribir esto de otra manera (quizás más corta)? ¿Hay una mejor manera de inicializar una matriz asignada en C++?¿Hay una mejor manera de inicializar una matriz asignada en C++?

int main(void) { 
    int* a; 
    a = new int[10]; 
    for (int i=0; i < 10; ++i) a[i] = 0; 
} 
+0

voy a votar para cerrar esto porque esta pregunta es muy vaga. Hay un número infinito de programas que se ajustan a los criterios establecidos. ¿Cuál es tu problema específico aquí? – Omnifarious

Respuesta

37
int *a =new int[10](); // Value initialization 

ISO C++ Section 8.5/5

Para valor-inicializar un objeto de tipo T significa:

- si T es un tipo de clase (cláusula 9) con un constructor-declarado de usuario (12,1), entonces se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene un constructor por defecto accesible);

- si T es un tipo de clase no sindical sin un constructor declarado por el usuario, entonces cada componente de datos no estáticos y de clase base de T tiene un valor inicializado;

- si T es un tipo de matriz, cada elemento se inicializa en valor;

- de otro modo, el objeto se inicializa a cero

Para las diferencias entre los términos zero initialization, value initialization y default initialization, leer this

+3

Este * es * mejor porque funciona bien con matrices de objetos y en un contexto de plantilla. Pero tenga en cuenta que, por el simple ejemplo dado anteriormente, es probable que el código generado sea muy similar (tal vez idéntico). – dmckee

20

Usted podría utilizar memset

establece el primer num bytes del bloque de memoria apuntada por ptr al valor especificado (interpretado como un unsigned char).

+5

Viejo, lo sé, pero realmente no hay ninguna razón para usar 'memset'. 'std :: fill' es una forma más genérica de obtener lo mismo (lo que significa que el código puede ser coherente) sin pérdida. – GManNickG

+0

Como 'memset' cambia por _bytes_, no se puede usar para valores distintos de cero. http://stackoverflow.com/a/17288891/2680660 – Efreeto

4
int main(void) { int *a; a = new int[10]; for(int i=0;i<10;++i) a[i]=0; } 

;-)

+5

Tiene 9 espacios superfluos, ¡demasiado legibles! –

+1

tiene razón: 'int main() {int i, * a = new int [10]; for (i = 0; i <10; ++ i) a [i] = 0;}' – nob

+1

usted son correctas: 'int (main)() {int * a = new (int [10])();}' –

22
std::vector<int> vec(10, 0); 
int *a = &vec.front(); 
+4

+1 para recomendar 'std :: vector' –

+1

Y el 0 ni siquiera es necesario, ya que' int() 'es el valor predeterminado. –

17

¿Qué tal 3 formas?

1. int *a = new int[10](); 

2. std::vector<int> a(10, 0); 

3. int *a = new int[10]; 
     memset(a, 0, sizeof(int) * 10); 

Debido a la demanda popular, un par más:

4. int *a = new int[10]; 
     std::fill(a, a + 10, 0); 

5. std::vector<int> a(10); 
     std::fill(a.begin(), a.end(), 0); 
+3

No ':: std :: fill'? :-) – Omnifarious

+0

@Omnifarious: Estaba a punto de incluir 'fill', pero me gusta el número 3 más que 4. :) –

+1

también' int a [10] = {0}; 'podría ser una forma alternativa. –

0

Soy un tipo C y no muy seguro de lo "nuevo" realmente, pero podría este trabajo?


int 
main(void) { 
    int i = 10;    // start at the far end of the array 
    int *a = new int[10]; 
    while (i--) a[i] = 0; // while (i == 9, 8, 7, ... , 0) 
}

Solo para mostrar mi nuevo favorito de contador de bucle: while (condition).

+1

1) ¿por qué está 'i' estático? 2) ¿Por qué 'while' en lugar de lo establecido, idiomático' para'? –

+0

¿Dónde está el calloc: P, si eres un chico C? –

+0

@Konrad: 'static' tiene cero inicialización; y 'while' es diferente de' for'. Sin embargo, estoy de acuerdo con usted: fuera del alcance de esta pregunta, estaría molesto con alguien que presentara el código que se muestra como una buena forma de hacer las cosas. –

2
#include <algorithm> 

int main() { 
    int *a = new int[10]; 
    std::fill(a, a + 10, 0); 
} 
1

Tal vez usted podría intentar algo como esto:

int* initIntArray(int size) { 
    int *temp = new int[size]; 
    for(int i = 0; i < size; i++) { 
     temp[i]=0; 
    } 
    return temp; 
} 

int main() { 
    int* a = initIntArray(10); 
    int* b = initIntArray(10); 
    int* c = initIntArray(10); 

    //do stuff with arrays 

    delete [] a; 
    delete [] b; 
    delete [] c; 

    return 0; 
} 
+0

¿Hay alguna razón por la que alguien votó por esta respuesta? me gustaría lo que hice mal (en serio !! no hay sarcasmo aquí) – jmont

+0

Tu respuesta parece estar bien. No entiendo los votos negativos tampoco. –

+0

Esto es solo un mal consejo; es casi una copia exacta de std :: fill_n con inconvenientes pero sin beneficio. –

2
int *a = (int*) calloc(10, sizeof(*a)); 

(y comprobar si es NULL, o reescribir un envoltorio seguro contra calloc).

0

por cierto, ¿qué tal el uso de calloc()? dicen

int i*=(int[10])calloc(10*sizeof(int))

Bueno, yo soy simplemente otro tipo C .. cualquier comentario es bienvenido aquí

+0

Porque en C++, las personas generalmente usan 'new' y si usas' calloc' tienes que usar 'free' en lugar de' delete'. –

+0

¿No toma dos parámetros? Matbe, querías decir 'int i * = (int [10]) calloc (10, sizeof (int));' –

Cuestiones relacionadas