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容器中的元素連接起來(lái):
string sum = accumulate(v.begin() , v.end() , string(" "));
這個(gè)函數(shù)調(diào)用的效果是:從空字符串開(kāi)始,把vec里的每個(gè)元素連接成一個(gè)字符串。
2.自定義數(shù)據(jù)類型的處理
C++ STL
中有一個(gè)通用的數(shù)值類型計(jì)算函數(shù)— accumulate()
,可以用來(lái)直接計(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
是對(duì)于自定義數(shù)據(jù)類型,我們就需要自己動(dòng)手寫一個(gè)回調(diào)函數(shù)來(lái)實(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ǔ)充
我們?cè)诒匾獣r(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ù)或不使定義范圍的迭代器無(wú)效的運(yùn)算。例如,為數(shù)值元素定義的乘法運(yùn)算函數(shù)會(huì)生成元素的乘積,只要初值為 1。實(shí)現(xiàn)浮點(diǎn)元素除法的函數(shù)會(huì)生成元素乘積的倒數(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
這里用來(lái)自于 functional
頭文件的函數(shù)作為第 4 個(gè)參數(shù)。如果有值為 0 的元素,可以像上一個(gè)代碼段中的 lambda 表達(dá)式那樣忽略它們。
string 類支持加法,因此可以將 accumulate() 應(yīng)用到 string 對(duì)象的序列上:
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"
這段代碼連接了以開(kāi)頭的 string 對(duì)象,并用空格將它們隔開(kāi)。
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: 12
lambda
表達(dá)式使用的 to_string()
函數(shù)會(huì)返回一個(gè)數(shù)值參數(shù)的 string 形式,所以應(yīng)用 accumulate()
到這里的整數(shù)序列會(huì)返回注釋中顯示的 string。
到此這篇關(guān)于C++的STL中accumulate函數(shù)的使用方法的文章就介紹到這了,更多相關(guān)C++的STL中accumulate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言 不使用strcat函數(shù)實(shí)現(xiàn)連接兩個(gè)字符串功能代碼
今天小編就為大家分享一篇C語(yǔ)言 不使用strcat函數(shù)實(shí)現(xiàn)連接兩個(gè)字符串功能代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12C/C++字符串與數(shù)字互轉(zhuǎn)的實(shí)現(xiàn)
這篇文章主要介紹了C/C++字符串與數(shù)字互轉(zhuǎn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01VS2022永久配置OpenCV開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)
本文主要介紹了VS2022永久配置OpenCV開(kāi)發(fā)環(huán)境的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02C語(yǔ)言中求和、計(jì)算平均值、方差和標(biāo)準(zhǔn)差的實(shí)例
這篇文章主要介紹了C語(yǔ)言中求和、計(jì)算平均值、方差和標(biāo)準(zhǔn)差的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12C語(yǔ)言實(shí)現(xiàn)運(yùn)動(dòng)會(huì)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)運(yùn)動(dòng)會(huì)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)經(jīng)典10大排序算法刨析
這篇文章主要介紹了C語(yǔ)言中常用的10種排序算法及代碼實(shí)現(xiàn),開(kāi)發(fā)中排序的應(yīng)用需要熟練的掌握,因?yàn)槭腔A(chǔ)內(nèi)容,那C語(yǔ)言有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō),需要的朋友可以參考一下2022-02-02