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开始,呈现递增的状态

 

posted @ 2012-04-26 08:55  w0w0  阅读(299)  评论(0)    收藏  举报