STL源码剖析学习十二:算法之数值算法
相关函数都包含在<numeric>中
先列个实例
#include<iostream> #include<numeric> #include<vector> #include<algorithm> #include<functional> #include<iterator> using namespace std; void main() { int ia[5] = {1,2,3,4,5}; vector<int> iv(ia, ia+5); cout<<accumulate(iv.begin(), iv.end(), 0)<<endl; cout<<accumulate(iv.begin(), iv.end(), 0, minus<int>())<<endl; cout<<inner_product(iv.begin(), iv.end(), iv.begin(), 10)<<endl; cout<<inner_product(iv.begin(), iv.end(), iv.begin(), 10, minus<int>(), plus<int>())<<endl; //把迭代器绑定到cout上,作为输出用 ostream_iterator<int> oite(cout, " "); partial_sum(iv.begin(), iv.end(), oite); cout<<endl; partial_sum(iv.begin(), iv.end(), oite, minus<int>()); cout<<endl; adjacent_difference(iv.begin(), iv.end(), oite); cout<<endl; adjacent_difference(iv.begin(), iv.end(), oite, plus<int>()); cout<<endl; //非标准函数 //cout<<power(10, 3)<<endl; //cout<<power(10, 3, plus<int>())<<endl; //int n = 3; //iota(iv.begin(), iv.end(), n); //for (int i=0; i<iv.size(); ++i) // cout<<iv[i]<<" "; system("pause"); }
accumulate(first, last, init [,binary_op]) { for(; first!=last; ++first) { init += *first; //init = binary_op(init, *first); } return init }
adjacent_difference(first, last, result [,binary_op]) { if(first == last) return result; *result = *first; //result开始的迭代器放置结果 return __adjacent_difference(first, last, result, value_type(first) [,binary_op]); } __adjacent_difference(first, last, result, T*) { T value = *first; while(++first != last) { T tmp = *first; *++result = tmp - value; //*++result = binary_op(tmp, value); value = tmp; } return ++result; }
inner_product(first1, last1, first2, init [, binary_op1, binary_op2]) { for(; first1!=last1; ++first1,++first2) { init = binary_op1(init, binary_op2(*first1,*first2)); } return init; }
partial_sum(first, last, result [,binary_op]) if(first == last) return result; *result = *first; //result开始的迭代器放置结果 return __partial_sum(first, last, result, value_type(first) [,binary_op]); } __partial_sum(first, last, result, T*) { T value = *first; while(++first != last) { T tmp = *first; *++result = tmp + value; //*++result = binary_op(tmp, value); value = tmp; } return ++result; }
pow为SGI专属,不在STL标准之列,对自己进行某种运算n次,默认为幂运算
iota用来改变某个特定区间的内容,使其每个元素从指定的value开始,呈现递增的状态
浙公网安备 33010602011771号