2010-07-14 3 views
6

Come scrivere questo in un altro (forse più breve) modo? C'è un modo migliore per inizializzare una matrice allocata in C++?C'è un modo migliore per inizializzare una matrice allocata in C++?

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

Sto votando per chiudere questo perché questa domanda è estremamente vaga. C'è un numero infinito di programmi che si adattano ai criteri indicati. Qual è il tuo problema specifico qui? – Omnifarious

risposta

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

ISO C++ Section 8.5/5

Per valore-inizializzare un oggetto di tipo T significa:

- se T è un tipo di classe (clausola 9) con un costruttore dall'utente dichiarato (12.1), quindi viene chiamato il costruttore predefinito per T (e l'inizializzazione è mal formata se T non ha un costruttore predefinito accessibile);

- se T è un tipo di classe non di unione senza un costruttore dichiarato dall'utente, quindi ogni membro di dati non statici e componente di classe base di T è inizializzato a valore;

- se T è un tipo di matrice, ogni elemento viene inizializzato in base al valore;

- altrimenti, l'oggetto viene inizializzato a zero

Per differenze tra i termini zero initialization, value initialization e default initialization, leggere this

+3

Questo * è * migliore perché si adatta bene alle matrici di oggetti e in un contesto di modello. Ma tieni presente che per il semplice esempio sopra riportato il codice generato è probabilmente molto simile (forse identico). – dmckee

20

Si potrebbe utilizzare memset

imposta il primo byte num del blocco di memoria puntata da ptr al valore specificato (interpretato come un unsigned char).

+5

Vecchio, lo so, ma non c'è davvero alcun motivo per usare 'memset'. 'std :: fill' è un modo più generico per ottenere la stessa cosa (il che significa che il codice può essere coerente) senza perdita. – GManNickG

+0

Poiché 'memset' cambia di _bytes_, non può essere usato per valori diversi da zero. 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

Questo ha 9 spazi superflui in esso - molto troppo leggibile! –

+1

hai ragione: 'int main() {int i, * a = new int [10]; per (i = 0; i <10; ++ i) a [i] = 0;}' – nob

+1

tu ho ragione: 'int (main)() {int * a = new (int [10])();}' –

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

+1 per raccomandare 'std :: vector' –

+1

E lo 0 non è nemmeno richiesto, poiché' int() 'è il valore predefinito. –

17

Che ne dici di 3 modi?

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

A grande richiesta, un altro paio:

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: In realtà stavo per includere 'fill', ma mi piace il numero 3 in più di 4. :) –

+1

anche' int a [10] = {0}; 'potrebbe essere un modo alternativo. –

0

Io sono un ragazzo C e non troppo sicuro di quello "nuovo" fa davvero, ma potrebbe questo lavoro?


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 per sfoggiare il mio nuovo favorito del ciclo-contatore: while (condizione).

+1

1) perché è "i" statico? 2) Perché 'while' invece del predefinito, idiomatico' for'? –

+0

Dov'è il calloc: P, se sei un ragazzo C? –

+0

@Konrad: 'static' è zero inizializzato; e 'while' è diverso da' for'. Sono d'accordo con te, però: al di fuori dello scopo di questa domanda, sarei arrabbiato con qualcuno che ha presentato il codice mostrato come un buon modo di fare le cose. –

2
#include <algorithm> 

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

Forse si potrebbe provare qualcosa di simile:

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

c'è un motivo per cui qualcuno ha votato questa risposta ?? mi piacerebbe quello che ho fatto di sbagliato (seriamente !! non sarcasmo qui) – jmont

+0

La tua risposta sembra soddisfacente. Nemmeno io capisco i downvotes. –

+0

Questo è solo un cattivo consiglio; è quasi una copia esatta di std :: fill_n con lati negativi ma nessun vantaggio. –

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

(e verificare se è NULL, o riscrivere un involucro sicuro contro calloc).

0

a proposito, che ne dici di usare calloc()? dicono

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

Beh, io sono solo un altro ragazzo C .. ogni commento è il benvenuto qui

+0

Perché in C++, le persone generalmente usano 'new' e se usi' calloc' devi usare 'free' invece di' delete'. –

+0

Non calloc prende due parametri? Mathe intendevi 'int i * = (int [10]) calloc (10, sizeof (int));' –