以下是关于 C++ 标准库 <numeric> 的详细介绍,包含目录和参考资料的出站链接。


目录


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>

  1. C++ Reference – <numeric>
    详细的官方文档,包含所有函数的说明及示例。
  2. Microsoft C++ Documentation – <numeric>
    Microsoft 提供的标准库文档,适合快速查阅。
  3. GNU libstdc++ Documentation
    GCC 的标准库实现文档,适合了解底层细节。

如果你有具体问题或需要更详细的代码示例,请告诉我,我会进一步协助你!