C++(STL源码):33---数值算法

  • 本文介绍数值算法:
    • accumulate
    • adjacent_difference
    • inner_product
    • partial_sum
    • power
    • itoa
  • 这些算法STL内部实现于<stl_numeric.h>中,应用层实现应该包含头文件<numeric>

一、accumulate

  • 功能:默认情况下,用来计算init和[first,last)区间内所有元素的总和
  • init一定要提供。这么做的原因是当[first,last)为空区间时仍能获得一个明确的值
  • 版本②接受一个仿函数
  • 返回值:返回计算出的和
  • 版本②中的二元操作符不必满足交换律和结合律

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //15。计算过程:0+1+2+3+4+5
    std::cout << accumulate(iv.begin(), iv.end(), 0) << std::endl;

    //-15。计算过程:0-1-2-3-4-5
    std::cout << accumulate(iv.begin(), iv.end(), 0, minus<int>()) << std::endl;

    return 0;
}

二、adjacent_difference

  • 功能:默认情况下,用来计算[first,last)区间内每两个元素之间的差,并将差保存在参数3所指向的result中
    • 注意对应关系:result[0]=*first、result[1]=*(first+1)-*(first)、result[1]=*(first+2)-*(first+1)...以此类推
  • 版本②接受一个仿函数
  • 该函数与partial_sum互为逆运算。例如对区间1、2、3、4、5执行adjacent_difference获得结果为1、1、1、1、1,再对此结果执行partial_sum,便可以得到原始区间值1、2、3、4、5
  • 返回值:返回参数3

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //将这个迭代器绑定到cout上,作为下面的输出
    ostream_iterator<int> oiter(std::cout, " ");

    //1 1 1 1 1
    adjacent_difference(iv.begin(), iv.end(), oiter);
    std::cout << std::endl;

    //1 3 5 7 9
    adjacent_difference(iv.begin(), iv.end(), oiter, plus<int>());
    std::cout << std::endl;

    return 0;
}

三、inner_product

  • 功能:默认情况下,以init参数为初始值,将[first1,last1)区间内的元素与以first2区间开始的元素进行内积(乘)操作,然后将结果返回
  • 返回值:返回内积的总和
  • 版本②提供两个仿函数参数,第一个用于表示两个区间之间对应元素操作之后是加、还是减等。第二个用于代表函数返回的是[first1,last1)区间与first2区间的各个元素之间是加还是减等

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //65。计算过程:10 + 1*1 + 2*2 + 3*3 + 4*4 + 5*5
    std::cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10) << std::endl;

    //-65。计算过程:10 - 1+1 - 2+2 - 3+3 - 4+4 - 5+5
    std::cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10,
        minus<int>(), plus<int>()) << std::endl;
    return 0;
}

四、partial_sum

  • 功能:默认情况下,用来计算局部和。在[first,last)区间上,迭代器每移动一次,就将其以及前面所有的元素的值进行一个和,然后保存到存储参数3中
    • 形式是result[0]=*first、result[1]=*(first)+*(first+1)、result[1]=*(first)+*(first+1)+*(first+2)...以此类推
  • 返回值:参数3
  • 备注:运算的时候是从前向后运算,而不是从后向前运算
  • 版本②提供一个仿函数,用来指定是每回运算是加还是减等

版本①

版本②

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    //将这个迭代器绑定到cout上,作为下面的输出
    ostream_iterator<int> oiter(std::cout, " ");

    //1 3 6 10 15
    partial_sum(iv.begin(), iv.end(), oiter);
    std::cout << std::endl;
    
    //1 -1 -4 -8 -13
    partial_sum(iv.begin(), iv.end(), oiter, minus<int>());
    std::cout << std::endl;

    return 0;
}

五、power

  • 功能:返回某数的n幂次方。这里的n幂次是指自己对自己进行某种运算达n次
  • 运算类型可由外界指定。例如指定乘法,那就是乘幂

版本①

版本②

六、itoa

  • 功能:把区间[first,last)内的元素依次改变为:*(first)=value、*(first+1)=value+1、*(first+2)=value+2...、*(first+(last-first-1))=value+(last-first-1)
  • 无返回值
  • 属于质变算法

源码

演示案例

#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;

int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);

    int n = 3;
    iota(iv.begin(), iv.end(), n);

    //3 4 5 6 7
    for (int i = 0; i < iv.size(); ++i)
        std::cout << iv[i] << " ";
    std::cout << std::endl;
    return 0;
}

发布了1462 篇原创文章 · 获赞 996 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/104281277