C++?STL?中的數(shù)值算法示例講解
以下算法均包含在頭文件 numeric 中
1.iota
該函數(shù)可以把一個(gè)范圍內(nèi)的序列從給定的初始值開(kāi)始累加
先看用法。
例:
假設(shè)我需要一個(gè)長(zhǎng)度為10,從5開(kāi)始遞增的序列
vector<int> a(10);
iota(begin(a), end(a), 5);
for (auto x : a) {
cout << x << " ";
}
輸出:
5 6 7 8 9 10 11 12 13 14
這樣就可以很方便的創(chuàng)建一個(gè)遞增的序列,而不用使用for循環(huán)
此外,該函數(shù)是使用連續(xù)的支持 operator++()的 T 類(lèi)型值填充序列
也就是說(shuō)double類(lèi)型也可以使用,string類(lèi)型也可以使用。
只要是重載了++運(yùn)算符的類(lèi)型都可以使用。
2.accumulate
曾經(jīng)在算法比賽中看見(jiàn)別人使用accumulate函數(shù)計(jì)算出了一個(gè)數(shù)組的和。
覺(jué)得特別的優(yōu)雅,像這樣:
vector<int> a(10);
iota(begin(a), end(a), 1);
cout << accumulate(begin(a), end(a), 0) << "\n"; // 計(jì)算從1加到10的和,從0開(kāi)始加
輸出:
55
從那天起,每當(dāng)我要求一個(gè)序列的和的時(shí)候,我都會(huì)使用這個(gè)方法...
但是今天,當(dāng)我看到accumulate的源碼之后:
template <class InputIterator, class T>
T accumulate (InputIterator first, InputIterator last, T init)
{
while (first!=last) {
init = init + *first; // or: init=binary_op(init,*first) for the binary_op version
++first;
}
return init;
}
注意看這里:

哇哦,它竟然還支持二元仿函數(shù),詳解C++ functional庫(kù)中的仿函數(shù)使用方法
于是,我有了一個(gè)大膽的想法。
求一個(gè)數(shù)組的乘積
vector<int> a(10);
iota(begin(a), end(a), 1);
cout << accumulate(begin(a), end(a), 1, multiplies<int>()) << "\n"; // 計(jì)算從1加到10的乘積,從1開(kāi)始乘
輸出:
3628800
同理,還可以求數(shù)組的減,數(shù)組的除,數(shù)組的模??
3.partial_sum
這個(gè)函數(shù)可以用來(lái)求前綴和,前綴和指一個(gè)數(shù)組的某下標(biāo)之前的所有數(shù)組元素的和(包含其自身)。
例如,1、2、3、4、5的前綴和數(shù)組為 1 3 6 10 15
vector<int> a(5);
iota(begin(a), end(a), 1);
partial_sum(begin(a), end(a), begin(a)); // 求a的前綴和,賦值給a數(shù)組(第三個(gè)參數(shù))
for (auto x : a) {
cout << x << " ";
}
輸出:
1 3 6 10 15
有了上一個(gè)函數(shù)的經(jīng)驗(yàn),我們還可以求一個(gè)數(shù)組的前綴乘、除等
例:
partial_sum(begin(a), end(a), begin(a), multiplies<int>());
輸出:
1 2 6 24 120
4.adjacent_difference
這個(gè)函數(shù)可以對(duì)一個(gè)序列里相鄰兩個(gè)元素進(jìn)行運(yùn)算,通過(guò)differerce這個(gè)詞可以看出來(lái),默認(rèn)是計(jì)算相鄰兩元素的差
vector<int> a{1, 4, 5, 100, 40};
adjacent_difference(begin(a), end(a), begin(a)); // 求a數(shù)組相鄰元素的差,賦值給a數(shù)組(第三個(gè)參數(shù))
for (auto x : a) {
cout << x << " ";
}
輸出:
1 3 1 95 -60
今天我想計(jì)算相鄰兩元素的乘積
adjacent_difference(begin(a), end(a), begin(a), multiplies<int>());
輸出:
1 4 20 500 4000
5.inner_product
這個(gè)函數(shù)默認(rèn)情況下可以求序列中每個(gè)元素的內(nèi)積之和:
vector<int> a(3);
iota(begin(a), end(a), 1);
cout << inner_product(begin(a), end(a), begin(a), 10) << "\n"; // 從初值10開(kāi)始加上序列各元素的內(nèi)積
輸出:
24
還可以用來(lái)求兩個(gè)序列元素兩兩相乘再相加的結(jié)果
vector<int> a{1, 2, 3};
vector<int> b{2, 3, 4};
// 1 * 2 + 2 * 3 + 3 * 4
cout << inner_product(begin(a), end(a), begin(b), 0) << "\n";
輸出:
20
此外,還可以通過(guò)仿函數(shù)來(lái)替代上述的兩個(gè)操作符 + 和 *
vector<int> a{1, 2, 3};
vector<int> b{2, 3, 4};
cout << inner_product(begin(a), end(a), begin(b), 1
, multiplies<int>(), minus<int>()) << "\n";
// 原來(lái)的加法 + // 原來(lái)的乘法 *
// 計(jì)算 (1 - 2) * (2 - 3) * (3 - 4) = -1
輸出:
-1
到此這篇關(guān)于C++ STL 中的數(shù)值算法示例講解的文章就介紹到這了,更多相關(guān)C++ 數(shù)值算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11如何實(shí)現(xiàn)無(wú)鎖隊(duì)列
這篇文章主要介紹了C++11如何實(shí)現(xiàn)無(wú)鎖隊(duì)列,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門(mén)及對(duì)比
這篇文章主要介紹了C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門(mén)及對(duì)比,同時(shí)二者在C++中的使用情況也基本上同理,是需要的朋友可以參考下2015-12-12
講解C++的do while循環(huán)和循環(huán)語(yǔ)句的嵌套使用方法
這篇文章主要介紹了講解C++的do while循環(huán)和循環(huán)語(yǔ)句的嵌套使用方法,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
c++結(jié)合opencv如何實(shí)現(xiàn)讀取多張圖片并顯示
這篇文章主要介紹了c++結(jié)合opencv如何實(shí)現(xiàn)讀取多張圖片并顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C語(yǔ)言中變參函數(shù)傳參的實(shí)現(xiàn)示例
本文主要介紹了C語(yǔ)言中變參函數(shù)傳參,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C++解決業(yè)務(wù)辦理時(shí)間問(wèn)題示例解析
這篇文章主要為大家介紹了C++解決業(yè)務(wù)辦理時(shí)間問(wèn)題示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
C/C++實(shí)現(xiàn)的游戲角色名稱(chēng)名字隨機(jī)生成代碼
這篇文章主要介紹了C/C++實(shí)現(xiàn)的游戲角色名稱(chēng)名字隨機(jī)生成代碼,本文特別針對(duì)一些古典游戲的角色名稱(chēng)進(jìn)行隨機(jī)生成,需要的朋友可以參考下2015-05-05
使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06

