2011-11-22 12 views
8

yo estaba tratando de utilizar la función de acumular para los vectoresC vectorial ++ acumula

vector <double> A; 
double B = 0; 

A.reserve(100); 
for(itr = 0; itr < 210; itr++) 
{ 
    term1 = pow(r[itr], 12); 
    term1 = 1/term1; 
    term2 = pow(r[itr], 6); 
    term2 = 2/term2; 
    A.push_back(term1 - term2); 
} 
B = accumulate(A.begin(), A.end(), 0); 

sin embargo, siempre me dieron B = 0, mientras que A tiene valores distintos de cero

+2

¿Podemos ver el código que llena A? –

+0

Debería publicar un ejemplo de código mínimo que reproduzca su problema. Esta pieza de código realmente no ayuda. –

+0

Más código requerido excepción. – hochl

Respuesta

23

std::accumulate es un poco furtivo en el sentido de que el tipo de resultado es el tipo del valor inicial, y no el tipo de los elementos del contenedor! Entonces su acumulador produce int s.

Para solucionar este problema, se acumulan en un double:

accumulate(A.begin(), A.end(), 0.0); 
//        ^^^^^^^ literal of type double 
+1

¡Eres un genio! – Josh

+1

+1 este es complicado. – hochl

2

la clave puede ser la forma en que su están haciendo [ ...] // Rellenar los valores en A ` vector A double B = 0;

A.reserve(100); 
A.push_back(1); 
A.push_back(2); 
B = accumulate(A.begin(), A.end(), 0); 
return 0; 

resuelve B = 3,0

si después de la reserva que están haciendo un mal código [0] = 1 esto es. lo que podría querer hacer es cambiar el tamaño.

reserva sólo le da la capacidad de memoria de respaldo, que no crea realmente los iteradores válidos .. así A.begin() todavía es igual A.end()

mirando cambio de código, sabes que el diferencia entre el número entero y el doble de matemáticas? son integral término1 y término 2?

+1

son dobles, y estaba teniendo un problema con la declaración acumulada (tuve que poner 0.0) ... bastante furtivo – Josh

Cuestiones relacionadas