該算法在numeric頭文件中定義。
假設vec是一個int型的vector對象,下面的代碼:
//sum the elements in vec starting the summation with the value 42 int sum = accumulate(vec.begin() , vec.end() , 42);
將sum設置為vec的元素之和再加上42。
accumulate帶有三個形參:頭兩個形參指定要累加的元素范圍,第三個形參則是累加的初值。
accumulate函數將它的一個內部變量設置為指定的初始值,然后在此初值上累加輸入范圍內所有元素的值。accumulate算法返回累加的結果,其返回類型就是其第三個實參的類型。
用於指定累加起始值的第三個參數是必要的,因為accumulate對將要累加的元素類型一無所知,除此之外,沒有別的辦法創建合適的起始值或者關聯的類型。
accumulate對要累加的元素類型一無所知,這個事實有兩層含義。首先,調用該函數時必需傳遞一個初始值,否則,accumulate將不知道使用什么初始值。其次,容器內的元素類型必須與第三個實參的類型匹配,或者可轉換為第三個實參的類型。在accumulate內部,第三個實參用作累加的起點;容器內的元素按順序連續累加到綜合之中。因此,必須能夠將元素類型加到總和類型上。
假定V是vector<double>類型的對象,則調用accumulate<v.begin() , v.end() , 0>是否有錯?如果有的話,錯在哪里?
從函數調用上看沒有錯誤。 調用accumulate函數必須滿足的條件包括:容器內的元素類型必須與第三個實參的類型匹配,或者可轉換為第三個實參的類型。上述調用中的第三個實參為int類型,而vector對象中的元素的類型為double類型,可以轉換為int類型。
但計算的結果不准確。因為將double類型轉換為int類型會截去小數部分,得到的求和結果是各元素的整數部分的和,是一個int類型的值,與實際的元素值總和相比會有比較大的誤差。
考慮下面的例子,可以使用accumulate把string型的vector容器中的元素連接起來:
//concatenate elements from V and store in sum string sum = accumulate(v.begin() , v.end() , string(" "));
這個函數調用的效果是:從空字符串開始,把vec里的每個元素連接成一個字符串。
下面讓我們用一個具體事例來說明:用accumulate統計vector<int>容器對象中的元素之和。
1 //讀取一系列int型數據,並將它們存儲到vector對象中, 2 //然后使用algorithm頭文件中定義的名為accumulate的函數, 3 //統計vector對象中的元素之和 4 #include<iostream> 5 #include<vector> 6 #include<numeric> 7 using namespace std; 8 9 int main() 10 { 11 int ival; 12 vector<int> ivec; 13 14 //讀入int型數據並存儲到vector對象中,直至遇到文件結束符 15 cout<<"Enter some integers(Ctrl+z to end): "<<endl; 16 while(cin >> ival) 17 ivec.push_back(ival); 18 19 //使用accumulate函數統計vector對象中的元素之和並輸出結果 20 cout<<"summation of elements in the vector: " 21 <<accumulate(ivec.begin() , ivec.end() , 0) //統計vector對象中的元素之和 22 <<endl; 23 24 return 0; 25 }