C++ STL 中的数值算法
原文:https://www.studytonight.com/cpp/stl/stl-numeric-algorithms
以下是我们将介绍的标准模板库中的一些数值算法:
- 方法
- 方法累加
- 部分求和法
iota
方法
此方法将范围[第一个,最后一个]中的所有连续元素指定为元素本身的递增值。它有 c++ 11 和更高版本。它的语法是iota(iterator first, iterator last, int value )
。
#include<iostream>
#include<numeric>
#include<vector>
using namespace std;
int main()
{
vector<int> v(10);
*/* now vector v is : 0,0,0,0,0,0,0,0,0,0 */*
**iota**(v.begin(), v.end(), 10 );
*/* now the vector v is 10,11,12,13,14,15,16,17,18,19 */*
}
accumulate
方法
此方法对范围[第一个,最后一个]中的所有元素执行操作 op ,并将结果存储到容器结果中。累加有两种变化,第一种是函数调用中没有定义二进制运算符,所以默认情况下执行加法,否则执行二进制运算符运算。
以下是带有二进制运算符 op 的累加方法的语法:
accumulate(iterator first, iterator last, object_type result, binaryoperator op)
下面是一个演示累加用法的示例:
#include<iostream>
#include<numeric>
#include<vector>
using namespace std;
int **myoperator**(int a, int b )
{
return a*b;
}
int main()
{
vector<int> v;
for(int i = 0 ; i < 10; i++) {
v.push_back(i);
}
*/* now vector v is : 0,1,2,3,4,5,6,7,8,9 */*
int result;
**accumulate**(v.begin(), v.end(), result) ;
*/* as no operator is specified, accumulate add all the elements
between v.begin() and v.end() and store the sum in result */
/* now result = 45 */*
**accumulate**(v.begin(), v.end(), result, myoperator) ;
*/* applies myoperator on all the elements in the range v.begin() and v.end() and store them in result */
/* now result = 9! */*
}
partial_sum
方法
该方法从迭代器开始对范围内的每一个元素赋值,迭代器的结果是对[第一个,最后一个]中的连续范围执行运算的结果。这里可以省略 binary_operation,如果没有指定二进制运算符,加法默认完成。
partial_sum 的语法是:
partial_sum(iterator first, iterator last, iterator result, binary_operation op)
下面是一个演示 partial_sum 用法的示例:
#include<iostream>
#include<numeric>
#include<vector>
using namespace std;
int **myoperator**(int a, int b)
{
return a*b;
}
int main()
{
int a[] = {1,2,3,4,5};
vector<int> v (a,a+5);
vector<int> v2;
*/* vector v is 1,2,3,4,5 */*
v2.resize(v.size());
**partial_sum**(v.begin(), v.end(), v2.begin());
*/* now v2 is : 1,3,6,10,15 */
/* sum of the successive range in v.begin() and v.end() */*
**partial_sum**(v.begin(), v.end(), v2.begin(), myoperator);
*/* now v2 is : 1,2,6,24,120 */*
}