以下是关于 C++ 标准库 <numeric>
的详细介绍,包含目录和参考资料的出站链接。
目录
- 1. 概述
- 2. 常用函数
- 2.1 std::accumulate
- 2.2 std::inner_product
- 2.3 std::adjacent_difference
- 2.4 std::partial_sum
- 2.5 std::iota
- 3. C++17 及之后的扩展
- 3.1 std::reduce
- 3.2 std::exclusive_scan 和 std::inclusive_scan
- 3.3 std::transform_reduce
- 4. 注意事项
- 5. 参考资料
1. 概述
<numeric>
是 C++ 标准库中的头文件,提供了一系列用于数值计算的函数。这些函数主要用于对容器中的元素进行数学运算,例如求和、累积、差分等。它通常与 <algorithm>
配合使用,适用于迭代器范围内的操作。
2. 常用函数
2.1 std::accumulate
- 功能:计算范围内元素的累积结果(例如求和)。
- 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4};
int sum = std::accumulate(v.begin(), v.end(), 0); // 从 0 开始累加
std::cout << sum << "\n"; // 输出 10
return 0;
}
- 自定义操作:可以传入二元操作符,例如乘法:
#include <functional>
int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies<int>());
// 输出 24 (1*2*3*4)
2.2 std::inner_product
- 功能:计算两个范围的内积(点积),或自定义二元操作的结果。
- 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {4, 5, 6};
int result = std::inner_product(v1.begin(), v1.end(), v2.begin(), 0);
std::cout << result << "\n"; // 输出 32 (1*4 + 2*5 + 3*6)
return 0;
}
2.3 std::adjacent_difference
- 功能:计算相邻元素的差(或自定义操作),结果存入目标范围。
- 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 4, 9, 16};
std::vector<int> result(v.size());
std::adjacent_difference(v.begin(), v.end(), result.begin());
for (int x : result) std::cout << x << " "; // 输出 1 3 5 7
return 0;
}
2.4 std::partial_sum
- 功能:计算部分和(前缀和),结果存入目标范围。
- 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4};
std::vector<int> result(v.size());
std::partial_sum(v.begin(), v.end(), result.begin());
for (int x : result) std::cout << x << " "; // 输出 1 3 6 10
return 0;
}
2.5 std::iota
- 功能:填充一个范围,从指定值开始递增。
- 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v(5);
std::iota(v.begin(), v.end(), 1); // 从 1 开始递增
for (int x : v) std::cout << x << " "; // 输出 1 2 3 4 5
return 0;
}
3. C++17 及之后的扩展
3.1 std::reduce
- 功能:类似
std::accumulate
,但支持并行执行,默认不保证顺序。 - 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4};
int sum = std::reduce(v.begin(), v.end(), 0); // 可并行求和
std::cout << sum << "\n"; // 输出 10
return 0;
}
3.2 std::exclusive_scan 和 std::inclusive_scan
- 功能:计算前缀和,
exclusive_scan
不包含当前元素,inclusive_scan
包含。 - 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4};
std::vector<int> result(v.size());
std::exclusive_scan(v.begin(), v.end(), result.begin(), 0);
for (int x : result) std::cout << x << " "; // 输出 0 1 3 6
return 0;
}
3.3 std::transform_reduce
- 功能:对范围应用变换后再归约,支持并行。
- 用法:
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4};
int result = std::transform_reduce(v.begin(), v.end(), 0, std::plus<>(),
[](int x) { return x * x; });
std::cout << result << "\n"; // 输出 30 (1^2 + 2^2 + 3^2 + 4^2)
return 0;
}
4. 注意事项
<numeric>
中的函数通常需要迭代器支持,默认使用加法或减法,但可以通过自定义操作符扩展功能。- C++17 引入的并行算法(如
std::reduce
)需要编译器支持并行执行策略(例如<execution>
头文件)。 - 操作大范围数据时,注意溢出问题,尤其是使用
std::accumulate
时。
5. 参考资料
以下是一些权威的参考资料链接,帮助你深入了解 <numeric>
:
- C++ Reference –
<numeric>
详细的官方文档,包含所有函数的说明及示例。 - Microsoft C++ Documentation –
<numeric>
Microsoft 提供的标准库文档,适合快速查阅。 - GNU libstdc++ Documentation
GCC 的标准库实现文档,适合了解底层细节。
如果你有具体问题或需要更详细的代码示例,请告诉我,我会进一步协助你!
发表回复