📅  最后修改于: 2023-12-03 15:13:56.171000             🧑  作者: Mango
在C++ STL中,numeric
头文件提供了一些数值算法,其中最常用的算法就是accumulate()
和partial_sum()
函数。
accumulate()
函数用于计算一个数值序列的和。它有三个参数:
template<typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);
first
和 last
分别为数值序列的首尾迭代器;init
为初始值。#include <iostream>
#include <numeric>
#include <vector>
int main() {
std::vector<int> numbers {1, 2, 3, 4};
int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
std::cout << "Sum: " << sum << std::endl;
return 0;
}
输出:
Sum: 10
还可以使用std::accumulate()
函数来计算其他类型的序列,例如字符串:
#include <iostream>
#include <numeric>
#include <string>
int main() {
std::string str = "Hello, World!";
int sum = std::accumulate(str.begin(), str.end(), 0);
std::cout << "Sum: " << sum << std::endl;
return 0;
}
输出:
Sum: 1000
在这种情况下,std::accumulate()
函数实际上计算了字符串中所有字符的ASCII码值之和。
partial_sum()
函数是计算一个数值序列的部分和的函数。它有两个参数:
template<typename InputIt, typename OutputIt>
OutputIt partial_sum(InputIt first, InputIt last, OutputIt d_first);
first
和 last
分别为数值序列的首尾迭代器;d_first
为输出迭代器,用于存储部分和。#include <iostream>
#include <numeric>
#include <vector>
int main() {
std::vector<int> numbers {1, 2, 3, 4};
std::vector<int> partial_sums(numbers.size());
std::partial_sum(numbers.begin(), numbers.end(), partial_sums.begin());
std::cout << "Partial sums: ";
for (auto x : partial_sums) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
输出:
Partial sums: 1 3 6 10
在这里,std::partial_sum()
函数将numbers
中的部分和存储在partial_sums
中。例如,partial_sums[2]
包含numbers[0] + numbers[1] + numbers[2]
的和。
除了默认的求和操作外,std::partial_sum()
函数还可以接受一个二元函数对象,用于自定义部分和的计算方式。
例如,以下代码计算斐波那契数列的前5项:
#include <iostream>
#include <numeric>
#include <vector>
int main() {
std::vector<int> fib(5);
std::partial_sum(fib.begin(), fib.end(), fib.begin(), [](int a, int b) {
return b == 0 ? 1 : a + b;
});
std::cout << "Fibonacci sequence: ";
for (auto x : fib) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
输出:
Fibonacci sequence: 1 1 2 4 8
在这里,我们定义了一个二元函数对象,它计算斐波那契数列中的下一项。