数值算法属于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 编程在线原创,转载请注明出处,谢谢。
这些算法我都忘记的差不多了。
呵呵,掌握思想就行了,要用的时候可以再温习一下。