Hide Tia Switch Save

C++STL之<numeric>库用法

<numeric> 头文件提供数值运算相关函数,以下是核心函数及用法:

1. accumulate - 累加/累积

cpp
vector<int> v = {1,2,3,4,5};
int sum = accumulate(v.begin(), v.end(), 0);                    // 15
int product = accumulate(v.begin(), v.end(), 1, multiplies<>()); // 120

2. inner_product - 内积计算

cpp
vector<int> a = {1,2,3}, b = {4,5,6};
int dot = inner_product(a.begin(), a.end(), b.begin(), 0);      // 32
int sum_abs_diff = inner_product(a.begin(), a.end(), b.begin(), 0, plus<>(), 
                                [](int x, int y){return abs(x-y);}); // 9

3. adjacent_difference - 相邻差值

cpp
vector<int> nums = {2,4,6,8};
vector<int> diff(4);
adjacent_difference(nums.begin(), nums.end(), diff.begin());    // [2,2,2,2]
adjacent_difference(nums.begin(), nums.end(), diff.begin(), multiplies<>()); // [2,8,24,48]

4. partial_sum - 前缀和

cpp
vector<int> nums = {1,2,3,4};
vector<int> prefix(4);
partial_sum(nums.begin(), nums.end(), prefix.begin());         // [1,3,6,10]
partial_sum(nums.begin(), nums.end(), prefix.begin(), multiplies<>()); // [1,2,6,24]

5. gcd - 最大公约数 (C++17)

cpp
int a = 12, b = 18;
int result = gcd(a, b);  // 6
int result2 = gcd(48, 60); // 12

6. lcm - 最小公倍数 (C++17)

cpp
int a = 12, b = 18;
int result = lcm(a, b);  // 36
int result2 = lcm(4, 6); // 12

7. midpoint - 安全中点 (C++17)

cpp
int x = 10, y = 20;
int mid = midpoint(x, y);  // 15
double dmid = midpoint(1.5, 3.5); // 2.5

综合示例

cpp
vector<int> data = {1,3,5};
int total = accumulate(data.begin(), data.end(), 0);           // 9
vector<int> pre(3), diff(3);
partial_sum(data.begin(), data.end(), pre.begin());            // [1,4,9]
adjacent_difference(data.begin(), data.end(), diff.begin());   // [1,2,2]
sort-template