2011-03-10 14 views
6

Ho assegnato un grande vettore doppio, diciamo con 100000 elementi. Ad un certo punto nel mio codice, voglio impostare tutti gli elementi su un valore costante, diverso da zero. Come posso farlo senza usare un ciclo for su tutti gli elementi? Sto anche usando il pacchetto blas, se aiuta.Inizializza doppio array con valori diversi da zero (blas)

risposta

9

Potreste usare std::fill (#include <algorithm>):

std::fill(v.begin(), v.end(), 1); 

Questo è essenzialmente anche solo un anello, naturalmente ..

+0

Tranne che ** può ** essere ottimizzato per alcuni tipi particolari e categorie iteratore (anche se è improbabile). –

+0

Raccomando anche questo metodo. –

0

Si utilizza sempre memset() se non si vuole loop.

Cioè, memset(myarr, 5, arrsize); per riempirlo con tutti i 5. Attenti alla conversione implicita in caratteri non firmati.

SINOSSI

#include <string.h> 

void * 
memset(void *b, int c, size_t len); 

DESCRIZIONE

The memset() function writes len bytes of value c (converted to an 
unsigned char) to the byte string b. 

E se il vettore è grande, e avete bisogno di andare veloce e si utilizza gcc, allora:

Generazione codice di spostamento blocco (memcpy) e il set di blocchi (memset) è stato riscritto. GCC può ora scegliere l'algoritmo migliore (loop, loop srotolato, istruzione con prefisso o una chiamata di libreria) basato su la dimensione del blocco da copiare e per la CPU ottimizzata per.

+0

-1: Ha un vettore doppio e memset per un vettore doppio (posso capire che è un array contiguo al di sotto del vettore), quando specificamente vuole che sia un valore diverso da zero non è banale. Il valore che può essere impostato tramite memset è un byte (dimensione del carattere non firmato), mentre la costante che desidera impostare è 4 byte –

+0

Manca il doppio vettore durante la lettura. Se ha bisogno di tutti i 4 byte pieni, allora sì, questo non funzionerà. Dall'altro lato, probabilmente vorrebbe contrassegnarli come "non usati" e un byte può fare il trucco. – Milan

+0

Tuttavia non vedo l'OP che lo menziona. Ma per essere precisi con la sua domanda, credo che std :: fill sia la sua scelta migliore. –

3

"riempimento" è giusto da quello che hai detto.

essere consapevoli del fatto che è anche possibile costruire un vettore pieno di un valore specificato:

std::vector<double> vec(100000, 3.14); 

Quindi, se "a un certo punto" significa "subito dopo la costruzione", fare questo, invece. Inoltre, significa che si può fare questo:

std::vector<double>(100000, 3.14).swap(vec); 

che potrebbe essere utile se "ad un certo punto" significa "immediatamente dopo la modifica della dimensione", e ci si aspetta/vuole il vettore per essere riallocato ("prevedere" se lo stai rendendo più grande della sua precedente capacità, "vuoi" se lo stai rendendo molto più piccolo e vuoi che venga tagliato per risparmiare memoria).

Problemi correlati