C++的STL中accumulate函數(shù)的使用方法
前言:
accumulate定義在#include中,作用有兩個(gè),一個(gè)是累加求和,另一個(gè)是自定義類型數(shù)據(jù)的處理
1.累加求和
int sum = accumulate(vec.begin() , vec.end() , 42);
accumulate帶有三個(gè)形參:頭兩個(gè)形參指定要累加的元素范圍,第三個(gè)形參則是累加的初值。accumulate函數(shù)將它的一個(gè)內(nèi)部變量設(shè)置為指定的初始值,然后在此初值上累加輸入范圍內(nèi)所有元素的值。accumulate算法返回累加的結(jié)果,其返回類型就是其第三個(gè)實(shí)參的類型。
可以使用accumulate把string型的vector容器中的元素連接起來:
string sum = accumulate(v.begin() , v.end() , string(" "));
這個(gè)函數(shù)調(diào)用的效果是:從空字符串開始,把vec里的每個(gè)元素連接成一個(gè)字符串。
2.自定義數(shù)據(jù)類型的處理
C++ STL中有一個(gè)通用的數(shù)值類型計(jì)算函數(shù)— accumulate(),可以用來直接計(jì)算數(shù)組或者容器中C++內(nèi)置數(shù)據(jù)類型,
例如:
#include <numeric>
int arr[]={10,20,30,40,50};
vector<int> va(&arr[0],&arr[5]);
int sum=accumulate(va.begin(),va.end(),0); ?//sum = 150是對于自定義數(shù)據(jù)類型,我們就需要自己動手寫一個(gè)回調(diào)函數(shù)來實(shí)現(xiàn)自定義數(shù)據(jù)的處理,然后讓它作為accumulate()的第四個(gè)參數(shù),accumulate()的原型為
template<class _InIt,
?? ?class _Ty,
?? ?class _Fn2> inline
?? ?_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func)
?? ?{?? ?// return sum of _Val and all in [_First, _Last), using _Func
?? ?for (; _First != _Last; ++_First)
?? ??? ?_Val = _Func(_Val, *_First);
?? ?return (_Val);
?? ?}例如:
#include <vector>
#include <string>
using namespace std;
?
struct Grade
{
?? ?string name;
?? ?int grade;
};
?
int main()
{
?? ?Grade subject[3] = {
?? ??? ?{ "English", 80 },
?? ??? ?{ "Biology", 70 },
?? ??? ?{ "History", 90 }
?? ?};
?
?? ?int sum = accumulate(subject, subject + 3, 0, [](int a, Grade b){return a + b.grade; });//a值是前面計(jì)算的中間結(jié)果 看前面的原型模板定義~ a 就是 _Val
?? ?cout << sum << endl;
?
?? ?system("pause");
?? ?return 0;
}
3.用法補(bǔ)充
我們在必要時(shí)可以定義自己的加法運(yùn)算。
例如:
???????std::vector<int> values {2, 0, 12, 3, 5, 0, 2, 7, 0, 8};
int min {3};
auto sum = std::accumulate(std::begin(values), std::end(values), 0, [min] (int sum, int v)
{
? ? if(v < min)
? ? ? ? return sum;
? ? return sum + v;
});
std::cout << "The sum of the elements greater than " << min-1<<"is " << sum << std::endl; ?// 35這里忽略了值小于 3 的元素。這個(gè)條件可以盡可能復(fù)雜,因此,我們能夠求出指定范圍內(nèi)的元素之和。這個(gè)運(yùn)算并不一定要是加法,可以是任何不修改操作數(shù)或不使定義范圍的迭代器無效的運(yùn)算。例如,為數(shù)值元素定義的乘法運(yùn)算函數(shù)會生成元素的乘積,只要初值為 1。實(shí)現(xiàn)浮點(diǎn)元素除法的函數(shù)會生成元素乘積的倒數(shù),只要初值為 1。
下面展示了如何生成元素的乘積:
std::vector<int> values {2, 3, 5, 7, 11, 13};
auto product = std::accumulate(std::begin(values), std::end(values), 1, std::multiplies<int>()); // 30030這里用來自于 functional 頭文件的函數(shù)作為第 4 個(gè)參數(shù)。如果有值為 0 的元素,可以像上一個(gè)代碼段中的 lambda 表達(dá)式那樣忽略它們。
string 類支持加法,因此可以將 accumulate() 應(yīng)用到 string 對象的序列上:
std:: vector<string> numbers {"one", "two", "three", "four", "five","six", "seven","eight", "nine","ten"};
auto s = std::accumulate(std::begin(numbers), std::end(numbers), string{},[](strings str, string& element)
{
? ? if (element[0] == 't')
? ? ? ? return str +' '+ element;
? ? return str;
}); // Result: " two three ten"這段代碼連接了以開頭的 string 對象,并用空格將它們隔開。
acumulate() 算法得到的結(jié)果可能和它所應(yīng)用的序列中的元素類型不同:
std::vector<int> numbers {1, 2, 3, 10, 11, 12};
auto s = std::accumulate(std::begin(numbers), std::end(numbers),string {"The numbers are"},[](strings str, int n){ return str + " : " + std::to_string(n);});
std::cout << s << std::endl;//Output: The numbers are: 1: 2: 3: 10: 11: 12lambda 表達(dá)式使用的 to_string() 函數(shù)會返回一個(gè)數(shù)值參數(shù)的 string 形式,所以應(yīng)用 accumulate() 到這里的整數(shù)序列會返回注釋中顯示的 string。
到此這篇關(guān)于C++的STL中accumulate函數(shù)的使用方法的文章就介紹到這了,更多相關(guān)C++的STL中accumulate內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vs2019中使用MFC構(gòu)建簡單windows窗口程序
今天發(fā)現(xiàn)網(wǎng)上好多MFC代碼都不能用,給大家分享一個(gè)簡單的MFC窗口語言,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
詳解設(shè)計(jì)模式中的中介者模式在C++編程中的運(yùn)用
這篇文章主要介紹了設(shè)計(jì)模式中的中介者模式在C++編程中的運(yùn)用,中介者模式將對象間的通信封裝到一個(gè)類中,將多對多的通信轉(zhuǎn)化為一對多的通信,降低了系統(tǒng)的復(fù)雜性,需要的朋友可以參考下2016-03-03
C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷的相關(guān)資料,為了加快查找節(jié)點(diǎn)的前驅(qū)和后繼。對二叉樹的線索化就是對二叉樹進(jìn)行一次遍歷,在遍歷的過程中檢測節(jié)點(diǎn)的左右指針是否為空,如果是空,則將他們改為指向前驅(qū)和后繼節(jié)點(diǎn)的線索,需要的朋友可以參考下2017-08-08

