STL演算法之accumulate函式學習
阿新 • • 發佈:2019-01-28
Accumulate函式學習、
標頭檔案#include<numeric>當以迭代器first和last及值init作為引數呼叫時
accumulate(first,last, init);將把init 和從 first 到last 指向的值進行累加,並返回累加得到的和,但不包括last指向的值。通過例項學習accumulate 函式。
#include<iostream> #include<vector> #include<numeric> using namespace std; int main() { cout<<"Demonstratint the accumulatefunction."<<endl; int x[5] = {2,3,5,7,11}; vector<int>vectorl(&x[0],&x[5]); int sum = accumulate(vectorl.begin(),vectorl.end(),0); cout<<"sum ="<<sum<<endl; //accumulate 直接對陣列進行操作 int sum1 = accumulate(&x[0],&x[5],0); cout<<"sum1 = "<<sum1<<endl; double y[5] = {2.1,3.123,5.3,7.0,11.0}; // accumulate 對浮點型資料相加。 vector<double>vectorl1(&y[0],&y[5]); double sum2 = accumulate(vectorl1.begin(),vectorl1.end(),0.0); cout<<"sum2 = "<<sum2<<endl; return 0; }
結果是
Demonstratint the accumulate function.
sum = 28
sum1 = 28
sum2 = 28.523
accumulate 計算連乘,
#include<iostream> #include<vector> #include<cassert> #include<numeric> using namespace std; int mult(int x, int y) { return x * y; } int main() { int x[5] = {2, 3, 5, 7, 11}; vector<int>vectorl(&x[0], &x[5]); int product = accumulate(vectorl.begin(), vectorl.end(), 1, mult); cout<<"product = "<<product<<endl; return 0; }
結果為
product = 2310
這裡傳遞給accumulate 函式一個普通函式 mult ,實際上傳遞的是該函式的地址。
用multiplies 和 accumulate 求連乘
#include<iostream> #include<vector> #include<numeric> #include<functional> using namespace std; int main() { int x[5] = {2, 3, 5, 7, 11}; vector<int>vectorl(&x[0], &x[5]); int product = accumulate(vectorl.begin(), vectorl.end(), 1,multiplies<int>()); cout<<"product = "<<product<<endl; return 0; }
結果為
product = 2310
通過multiplies<int>() 呼叫了以int型別例項化的multiplies類的預設建構函式。
multiplies標頭檔案為#include <functional>
一個例項在 http://www.linuxidc.com/Linux/2015-04/116423.htm 搬過來學習。
#include <vector>
#include <numeric>
#include <functional>
#include <iostream>
using namespace std;
int main( )
{
vector <int> v1, v2( 20 );
vector <int>::iterator Iter1, Iter2;
int i;
for ( i = 1 ; i < 21 ; i++ )
{
v1.push_back( i );
}
cout << "最初向量v1中個元素的值為:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// accumulate函式的第一個功能,求和
int total;
total = accumulate ( v1.begin ( ) , v1.end ( ) , 0 );
cout << "整數從1到20的和為: "
<< total << "." << endl;
// 構造一個前n項和的向量
int j = 0, partotal;
for ( Iter1 = v1.begin( ) + 1; Iter1 != v1.end( ) + 1 ; Iter1++ )
{
partotal = accumulate ( v1.begin ( ) , Iter1 , 0 );
v2 [ j ] = partotal;
j++;
}
cout << "前n項和分別為:\n ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl << endl;
// accumulate函式的第二個功能,計算連乘積
vector <int> v3, v4( 10 );
vector <int>::iterator Iter3, Iter4;
int s;
for ( s = 1 ; s < 11 ; s++ )
{
v3.push_back( s );
}
cout << "向量v3的初始值分別為:\n ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
int ptotal;
ptotal = accumulate ( v3.begin ( ) , v3.end ( ) , 1 , multiplies<int>( ) );
cout << "整數1到10的連乘積為: "
<< ptotal << "." << endl;
// 構造一個前n項積的向量
int k = 0, ppartotal;
for ( Iter3 = v3.begin( ) + 1; Iter3 != v3.end( ) + 1 ; Iter3++ ) {
ppartotal = accumulate ( v3.begin ( ) , Iter3 , 1 , multiplies<int>( ) );
v4 [ k ] = ppartotal;
k++;
}
cout << "前n項積分別為:\n ( " ;
for ( Iter4 = v4.begin( ) ; Iter4 != v4.end( ) ; Iter4++ )
cout << *Iter4 << " ";
cout << ")." << endl;
}
剛開始學習STL,當做記筆記了!!!