数值算法属于C++泛型算法中的一种,为容器的元素执行不同的数学计算。这些算法包括accumulate, adjacent_difference, inner_product, iota, partial_sum, power,下面用程序实例演示每一个算法。
1、accumulate——返回指定区间内所有元素和与指定值之和
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int main ()
{
int arr[] = { 1,2,3,4,5 };
vector<int> v(arr,arr+5);
// 1+2+3+4+5 and + 0
int sum = accumulate(v.begin(), v.end(), 0);
cout << "sum = " << sum << endl;
return 0;
}
运行结果:
// sum = 15
2、adjacent_difference——对指定区间内的相邻元素按照指定函数的方法执行计算,并将结果存入指定地址开始的区间中,如果未指定函数及存储地址则默认做减法并将结果存入原区间
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
using namespace std;
int main ()
{
vector i(10);
vector result( i.size() );
for ( int j = 0; j < 10; j++ )
i[j] = (j+1);
adjacent_difference(i.begin(), i.end(),
result.begin(), multiplies<int>());
ostream_iterator iter (cout, " ");
cout << "vector i : ";
copy (i.begin(), i.end(), iter);
cout << endl;
cout << "vector result : ";
copy (result.begin(), result.end(), iter);
cout << endl;
return 0;
}
运行结果:
// vector i : 1 2 3 4 5 6 7 8 9 10
// vector result : 1 2 6 12 20 30 42 56 72 90
3、inner_product——计算两个输入序列的内积,默认情况下,inner_product算法使用+和*运算符,通过把函数对象作为参数传递给inner_product,便可以使用其它运算符;
#include <iostream>
#include <list>
#include <algorithm>
#include <numeric>
using namespace std;
int main()
{
list<int> li;
for ( int i = 1; i <= 6; i++ )
li.push_back(i);
copy(li.begin(),li.end(),
ostream_iterator<int>(cout," "));
cout << endl;
/* (0 + 1*1 + 2*2 + 3*3 + 4*4 + 5*5 + 6*6) */
cout << "inner product: "
<< inner_product
(li.begin(), li.end(), // 第一区间
li.begin(), // 第二区间
0) // 初始值
<< endl;
/* (0 + 1*6 + 2*5 + 3*4 + 4*3 + 5*2 + 6*1) */
cout << "inner reverse product: "
<< inner_product
(li.begin(), li.end(), // first range
li.rbegin(), // second range
0) // initial value
<< endl;
/* (1 * 1+1 * 2+2 * 3+3 * 4+4 * 5+5 * 6+6) */
cout << "product of sums: "
<< inner_product
(li.begin(), li.end(), // first range
li.begin(), // second range
1, // initial value
multiplies(), // inner operation
plus<int>()) // outer operation
<< endl;
return 0;
}
运行结果:
// 1 2 3 4 5 6
// inner product: 91
// inner reverse product: 56
// product of sums: 46080
4、iota——为指定区间的元素赋值,区间内的每一个元素从指定的值开始,呈现递增状态;
#include <iostream>
#include <vector>
#include <numeric>
int main()
{
vector<int> V(10);
iota(V.begin(), V.end(), 1);
copy(V.begin(), V.end(),
ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
运行结果:
// 1 2 3 4 5 6 7 8 9 10
5、partial_sum——对指定区间的元素求部分和,如果将指定函数作为参数,可以按照指定函数的运算法则求部分结果;
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
using namespace std;
int main()
{
vector<int> v(5);
iota(v.begin(),v.end(),1);
copy(v.begin(),v.end(),
ostream_iterator<int>(cout," "));
cout << endl;
//输出部分和
partial_sum (v.begin(), v.end(), // source range
ostream_iterator<int>(cout," ")); // destination
cout << endl;
// 输入部分积
partial_sum (v.begin(), v.end(), // source range
ostream_iterator<int>(cout," "), // destination
multiplies<int>()); // operation
cout << endl;
return 0;
}
运行结果:
// 1 2 3 4 5
// 1 3 6 10 15
// 1 2 6 24 120
6、power——返回指定值的指定次方幂
#include <iostream>
#include <numeric>
using namespace std;
int main()
{
cout << "2 ** 30 = " << power(2, 30) << endl;
return 0;
}
运行结果:
// 2 ** 30 = 1073741824
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。




这些算法我都忘记的差不多了。
呵呵,掌握思想就行了,要用的时候可以再温习一下。