2011-03-10 12 views
6

He asignado un gran vector doble, digamos con 100000 elementos. En algún punto de mi código, quiero configurar todos los elementos en un valor constante distinto de cero. ¿Cómo puedo hacer esto sin usar un bucle for para todos los elementos? También estoy usando el paquete blas, si esto ayuda.Initialize double array con valores distintos de cero (blas)

Respuesta

9

Usted podría utilizar std::fill (#include <algorithm>):

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

Esto es esencialmente también a sólo un bucle por supuesto ..

+0

Excepto que ** puede ** optimizarse para algunos tipos particulares y categorías de iteradores (incluso si es poco probable). –

+0

Recomendaría este método también. –

0

Siempre se utiliza memset() si no desea bucle.

Esto es, memset(myarr, 5, arrsize); para completarlo con los 5's. Tenga cuidado con la conversión implícita a char sin signo.

SINOPSIS

#include <string.h> 

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

DESCRIPCIÓN

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

Y si el vector es grande, y lo necesita para ir rápido y se está utilizando gcc, entonces:

Generación de código de movimiento de bloque (memcpy) y conjunto de bloques (memset) fue reescrito. GCC ahora puede elegir el mejor algoritmo (bucle, bucle desenrollado, instrucción con prefijo de rep o una llamada de biblioteca) basado en el tamaño del bloque que se está copiando y para el que está optimizada la CPU.

+0

-1: Tiene un vector doble y memset para un vector doble (puedo entender que es una matriz contigua debajo del vector), cuando específicamente quiere que sea un valor distinto de cero no es trivial. El valor que se puede establecer a través de memset es un byte (tamaño de char sin signo), mientras que la constante que quiere establecer es 4 bytes –

+0

Se perdió el vector doble mientras se leía. Si necesita todos los 4 bytes llenos, entonces sí, esto no funcionará. Por otro lado, probablemente quiera marcarlos como "no utilizados" y un byte puede hacer el truco. – Milan

+0

No veo el OP mencionar eso sin embargo. Pero para ser preciso con su pregunta, creo que std :: fill es su mejor opción. –

3

'fill' es lo que has dicho.

tener en cuenta que también es posible construir un vector lleno de un valor especificado:

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

Así que si "en algún momento" significa "inmediatamente después de la construcción", hacen de este lugar. Además, significa que usted puede hacer esto:

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

que podría ser útil si "en algún momento" significa "inmediatamente después de cambiar el tamaño", y que espera/quieren que el vector se puede reasignar ("espera" si lo está haciendo más grande que su capacidad anterior, "quiere" si lo está haciendo mucho más pequeño y lo quiere recortar para ahorrar memoria).

Cuestiones relacionadas