欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++的STL中accumulate函數(shù)的使用方法

 更新時(shí)間:2022年03月24日 09:43:49   作者:_Phoebe__  
這篇文章主要介紹了C++的STL中accumulate的使用方法,accumulate作用是累加求和即自定義類型數(shù)據(jù)處理,下文具體的操作方法需要的小伙伴可以參考一下

前言:

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)文章

最新評(píng)論