C++ STL 中的数值算法

原文:https://www.studytonight.com/cpp/stl/stl-numeric-algorithms

以下是我们将介绍的标准模板库中的一些数值算法:

  • 方法
  • 方法累加
  • 部分求和法

iota方法

此方法将范围[第一个,最后一个]中的所有连续元素指定为元素本身的递增值。它有 c++ 11 和更高版本。它的语法是iota(iterator first, iterator last, int value )

#include<iostream>
#include<numeric>
#include<vector>

using namespace std;

int main()
{
    vector<int> v(10);
    */* now vector v is : 0,0,0,0,0,0,0,0,0,0  */*

    **iota**(v.begin(), v.end(), 10 );

    */* now the vector v is 10,11,12,13,14,15,16,17,18,19  */*
}

accumulate方法

此方法对范围[第一个,最后一个]中的所有元素执行操作 op ,并将结果存储到容器结果中。累加有两种变化,第一种是函数调用中没有定义二进制运算符,所以默认情况下执行加法,否则执行二进制运算符运算

以下是带有二进制运算符 op 的累加方法的语法:

accumulate(iterator first, iterator last, object_type result, binaryoperator op)

下面是一个演示累加用法的示例:

#include<iostream>
#include<numeric>
#include<vector>

using namespace std;

int **myoperator**(int a, int b )
{
    return a*b;
}

int main()
{
    vector<int> v;

    for(int i = 0 ; i < 10; i++) {
    v.push_back(i);
    }

    */* now vector v is : 0,1,2,3,4,5,6,7,8,9  */*

    int result;

    **accumulate**(v.begin(), v.end(), result) ;

    */* as no operator is specified, accumulate add all the elements 
    between v.begin() and v.end() and store the sum in result */ 

    /* now result = 45 */*

    **accumulate**(v.begin(), v.end(), result, myoperator) ;

    */* applies myoperator on all the elements in the range v.begin() and v.end() and store them in result */ 

    /* now result = 9!  */*
}

partial_sum方法

该方法从迭代器开始对范围内的每一个元素赋值,迭代器的结果是对[第一个,最后一个]中的连续范围执行运算的结果。这里可以省略 binary_operation,如果没有指定二进制运算符,加法默认完成。

partial_sum 的语法是:

partial_sum(iterator first, iterator last, iterator result, binary_operation op)

下面是一个演示 partial_sum 用法的示例:

#include<iostream>
#include<numeric>
#include<vector>

using namespace std;

int **myoperator**(int a, int b)
{
    return a*b;
}

int main()
{
    int a[] = {1,2,3,4,5};
    vector<int> v (a,a+5);
    vector<int> v2;
    */* vector v is 1,2,3,4,5 */*
    v2.resize(v.size());

    **partial_sum**(v.begin(), v.end(), v2.begin());

    */* now v2 is : 1,3,6,10,15 */
    /* sum of the successive range in v.begin() and v.end() */*

    **partial_sum**(v.begin(), v.end(), v2.begin(), myoperator);

    */* now v2 is : 1,2,6,24,120 */*
}