2011-11-22 16 views
8

starałem się używać funkcji akumuluj dla wektorówC++ wektor gromadzi

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

jednak ja zawsze dostaje B = 0, natomiast A miał wartości niezerowe

+2

mogliśmy zobaczyć kod, który wypełnia? –

+0

Powinieneś opublikować przykład kodu minimalnego, który odzwierciedla Twój problem. Ten fragment kodu naprawdę nie pomaga. –

+0

Więcej kodu wymagany wyjątek. – hochl

Odpowiedz

23

std::accumulate jest nieco podstępne w tym sensie, że typem wyniku jest typ wartości początkowej, a , a nie typ elementów kontenera! Więc twój akumulator produkuje int s.

Aby rozwiązać ten problem, gromadzą się w double:

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

Jesteś geniuszem! – Josh

+1

+1 ten jest trudny. – hochl

2

kluczem może być w jaki sposób robią [ ...] // Wypełnij wartości A ` wektor A podwójne B = 0;

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

postanawia B = 3,0

jeśli po rezerwy robisz [0] = 1 to jest zły kod. Zamiast tego powiedz, że możesz zmienić rozmiar.

rezerwa daje Ci tylko pojemność pamięci podkład, to w rzeczywistości nie tworzyć poprawne iteratory .. więc A.begin() nadal równa A.end()

patrząc na zmiany kodu, wiesz, że różnica między liczbą całkowitą a podwójną matematyką? są term1 i term 2 integralną?

+1

są to podwójne, i miałem problem z akumuluj oświadczenie (musiałem umieścić w 0.0) ... dość podstępne – Josh