数值运算
数值运算是对容器的内容进行数值计算。
函数 | 算法 |
---|---|
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 |