numeric 数值算法

数值运算

数值运算是对容器的内容进行数值计算。

函数 算法
accumulate(first, last, init) 元素累加
inner_product(first, last, first2, init) 内积
partial_sum(first, last, result) 局部总和
adjacent_difference(first, last, result) 相邻元素的差额


accumulate(first, last, init)

计算 init 与 迭代器 first 和 last 指明范围内的各元素值的总和。

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

using namespace std;

void Test_accumulate()
{
    vector<int> int_vector{ 1,2,3 };

    cout << "Vector:";
    for (auto item : int_vector) cout << item << ' ';
    cout << endl;

    // 10(初始值) + 1 + 2 + 3
    int result = accumulate(int_vector.begin(), int_vector.end(), 10);
    cout << "Result1:" << result << endl;

    // 10(初始值) * 1 * 2 * 3
    result = accumulate(int_vector.begin(), int_vector.end(), 10, multiplies<int>());
    cout << "Result2:" << result << endl;
}
Output
Vector:1 2 3
Result1:16
Result2:60


inner_product(first, last, first2, init)

先计算迭代器 first 和 last 指明的序列与 first2 开始的相同长度的序列的内积,然后返回内积与 init 的和。

计算内积的步骤为:

依次把第 1 个序列的各个元素值与第 2 个序列对应位置的元素值相乘,再计算各个内积的和。

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

using namespace std;

void Test_inner_product()
{
    int init = 10; // 初始值
    vector<int> int_vector{ 1,2,3 };
    vector<int> int_vector2{ 4,5,6,7 };

    cout << "Init:" << init << endl;
    cout << "Vector1:";
    for (auto item : int_vector) cout << item << ' ';
    cout << endl;
    cout << "Vector2:";
    for (auto item : int_vector2) cout << item << ' ';
    cout << endl;

    cout << "Result:";
    cout << init << '+';
    for (size_t i = 0; i < int_vector.size(); i++)
        cout << int_vector[i] * int_vector2[i] << (i == int_vector.size() - 1 ? '=' : '+');

    int result = inner_product(int_vector.begin(), int_vector.end(), int_vector2.begin(), init);
    cout << result << endl;
}
Output
Init:10
Vector1:1 2 3
Vector2:4 5 6 7
Result:10+4+10+18=42


partial_sum(first, last, result)

对迭代器 first 和 last 指明范围内的元素进行部分求和,然后把计算结果赋予从 result 开始的序列。

等价操作:
*(d_first)   = *first;
*(d_first+1) = *first + *(first+1);
*(d_first+2) = *first + *(first+1) + *(first+2);
*(d_first+3) = *first + *(first+1) + *(first+2) + *(first+3);
...
#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

void Test_partial_sum()
{
    vector<int> int_vector{ 1,2,3,4,5 };
    vector<int> result(int_vector.size());
    partial_sum(int_vector.begin(), int_vector.end(), result.begin());

    cout << "Vector:";
    for (auto item : int_vector) cout << item << ' ';
    cout << endl;

    cout << "Result:";
    for (auto item : result) cout << item << ' ';
    cout << endl;
}
Output
Vector:1 2 3 4 5
Result:1 3 6 10 15


adjacent_difference(first, last, result)

计算迭代器 first 和 last 指明范围内的相邻元素的差值,并把计算结果赋予从 result 开始的序列。

等价操作:
*(d_first)   = *first;
*(d_first+1) = *(first+1) - *(first);
*(d_first+2) = *(first+2) - *(first+1);
*(d_first+3) = *(first+3) - *(first+2);
...
#include <iostream>
#include <vector>
#include <numeric>
#include <iomanip>

using namespace std;

void Test_adjacent_difference()
{
    vector<int> int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(rand() % 10);

    vector<int> result(int_vector.size());
    adjacent_difference(int_vector.begin(), int_vector.end(), result.begin());

    cout << "Vector:";
    for (auto item : int_vector) cout << setw(3) << item << ' ';
    cout << endl;

    cout << "Result:";
    for (auto item : result) cout << setw(3) << item << ' ';
    cout << endl;
}
Output
Vector: 1 7 4 0 9 4 8 8 2 4
Result: 1 6 -3 -4 9 -5 4 0 -6 2


相关参考

微软文档(numeric)

cppreference(numeric)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容