網(wǎng)站首頁 編程語言 正文
前言:
accumulate
定義在#include
中,作用有兩個,一個是累加求和,另一個是自定義類型數(shù)據(jù)的處理
1.累加求和
int sum = accumulate(vec.begin() , vec.end() , 42);
accumulate帶有三個形參:頭兩個形參指定要累加的元素范圍,第三個形參則是累加的初值。accumulate
函數(shù)將它的一個內(nèi)部變量設(shè)置為指定的初始值,然后在此初值上累加輸入范圍內(nèi)所有元素的值。accumulate
算法返回累加的結(jié)果,其返回類型就是其第三個實參的類型。
可以使用accumulate把string型的vector容器中的元素連接起來:
string sum = accumulate(v.begin() , v.end() , string(" "));
這個函數(shù)調(diào)用的效果是:從空字符串開始,把vec里的每個元素連接成一個字符串。
2.自定義數(shù)據(jù)類型的處理
C++ STL
中有一個通用的數(shù)值類型計算函數(shù)— accumulate()
,可以用來直接計算數(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ù)類型,我們就需要自己動手寫一個回調(diào)函數(shù)來實現(xiàn)自定義數(shù)據(jù)的處理,然后讓它作為accumulate()
的第四個參數(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值是前面計算的中間結(jié)果 看前面的原型模板定義~ a 就是 _Val ?? ?cout << sum << endl; ? ?? ?system("pause"); ?? ?return 0; }
3.用法補充
我們在必要時可以定義自己的加法運算。
例如:
???????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 的元素。這個條件可以盡可能復(fù)雜,因此,我們能夠求出指定范圍內(nèi)的元素之和。這個運算并不一定要是加法,可以是任何不修改操作數(shù)或不使定義范圍的迭代器無效的運算。例如,為數(shù)值元素定義的乘法運算函數(shù)會生成元素的乘積,只要初值為 1。實現(xià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 個參數(shù)。如果有值為 0 的元素,可以像上一個代碼段中的 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: 12
lambda
表達(dá)式使用的 to_string()
函數(shù)會返回一個數(shù)值參數(shù)的 string 形式,所以應(yīng)用 accumulate()
到這里的整數(shù)序列會返回注釋中顯示的 string。
原文鏈接:https://blog.csdn.net/Li5566123/article/details/123622929
相關(guān)推薦
- 2022-09-17 oracle臨時表空間的作用與創(chuàng)建及相關(guān)操作詳解_oracle
- 2022-08-13 【解決】訪問網(wǎng)關(guān)gateway報錯,“status“:503,“error“: “Service U
- 2022-08-19 Android開發(fā)自定義實時圖表控件實現(xiàn)示例_Android
- 2021-12-02 利用Matlab仿真實現(xiàn)圖像煙霧識別(k-means聚類圖像分割+LBP+PCA+SVM)_C 語言
- 2022-12-24 React?組件的狀態(tài)下移和內(nèi)容提升的操作方法_React
- 2022-02-24 Antv G2折線圖+柱狀圖 自定義圖例(legend)和tooltip
- 2022-08-28 C#中類的使用教程詳解_C#教程
- 2022-05-12 基于nginx反向代理獲取用戶真實Ip地址詳解_nginx
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支