2011-11-22 94 views
8

我試圖使用矢量C++矢量積累

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

累加功能,我總是得到B = 0,而A有非零值

+2

我們可以看到,填補了該代碼? –

+0

您應該發佈一個代碼示例來重現您的問題。這段代碼並沒有真正的幫助。 – 2011-11-22 13:31:00

+0

需要更多代碼例外。 – hochl

回答

23

std::accumulate有點鬼鬼祟的意思,就是結果的類型是初始值的類型,而不是這個容器元素的類型!所以你的累加器產生了ints。

爲了解決這個問題,聚積成double

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

你是一個天才! – Josh

+1

+1這個很棘手。 – hochl

2

的關鍵可能是你是怎麼做的[ ...] //將值填入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; 

解析B = 3.0

如果你正在做一個[0] = 1 這是不好的代碼儲備之後。 你可能想要做的就是調整大小。

儲備只給你的支持內存容量,它實際上並沒有建立有效的迭代器..所以A.begin()仍然等於A.end()

查看代碼的改變,你知道的整數和雙數學之間的區別? 是term1和term 2的積分嗎?

+1

他們是雙打的,我在積累陳述(我不得不放在0.0)有一個問題...很狡猾 – Josh