STL数值算法定义在<numeric>头文件中,是C++标准库为数值计算场景提供的一组通用函数,能够替代大量手写循环,让数值相关逻辑更简洁清晰。这类算法主要围绕基础数值运算展开,覆盖了日常开发中绝大多数常见的数值处理需求。

accumulate算法使用技巧
accumulate是最常用的数值算法之一,默认功能是计算区间内所有元素的累加和,也支持自定义运算规则,实现乘积、拼接等自定义逻辑。
它的前两个参数是迭代器范围,第三个参数是初始值,第四个可选参数是自定义二元操作函数。需要注意的是,初始值的类型会影响整个运算的结果类型,比如初始值用0会触发整数运算,用0.0则会触发浮点数运算。
基础求和示例:
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
// 计算1到5的和,初始值为0
int sum = std::accumulate(nums.begin(), nums.end(), 0);
std::cout << "总和是:" << sum << std::endl; // 输出15
return 0;
}
自定义运算实现乘积计算:
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> nums = {1, 2, 3, 4};
// 自定义乘法操作,初始值为1
int product = std::accumulate(nums.begin(), nums.end(), 1, std::multiplies<int>());
std::cout << "乘积是:" << product << std::endl; // 输出24
return 0;
}
inner_product算法使用技巧
inner_product用于计算两个区间的内积,默认逻辑是先计算对应元素的乘积再求和,同样支持自定义运算规则,修改乘积和累加的逻辑。
它的前两个参数是第一个区间的迭代器范围,第三个参数是第二个区间的起始迭代器,第四个参数是初始值,第五、六个可选参数分别是自定义的乘积运算和累加运算。
基础内积示例:
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {4, 5, 6};
// 计算1*4 + 2*5 + 3*6,初始值为0
int result = std::inner_product(v1.begin(), v1.end(), v2.begin(), 0);
std::cout << "内积结果:" << result << std::endl; // 输出32
return 0;
}
自定义运算实现加权求和:
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> scores = {80, 90, 70};
std::vector<int> weights = {2, 3, 1};
// 自定义乘积为相乘,累加为相加,计算加权总分
int total = std::inner_product(scores.begin(), scores.end(), weights.begin(), 0,
std::plus<int>(), std::multiplies<int>());
std::cout << "加权总分:" << total << std::endl; // 输出80*2+90*3+70*1=470
return 0;
}
partial_sum算法使用技巧
partial_sum用于计算区间的前缀和,将结果存放到新的区间中,默认是累加前缀和,也支持自定义运算规则。
前两个参数是输入区间的迭代器范围,第三个参数是输出区间的起始迭代器,第四个可选参数是自定义二元运算函数。
基础前缀和示例:
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> nums = {1, 2, 3, 4};
std::vector<int> prefix(4);
// 计算前缀和,prefix[0]=1, prefix[1]=1+2=3, prefix[2]=3+3=6, prefix[3]=6+4=10
std::partial_sum(nums.begin(), nums.end(), prefix.begin());
for (int num : prefix) {
std::cout << num << " "; // 输出1 3 6 10
}
return 0;
}
adjacent_difference算法使用技巧
adjacent_difference用于计算相邻元素的差值,将结果存放到新的区间中,第一个元素直接复制到输出区间,后续元素是后一个元素减前一个元素的结果,同样支持自定义运算规则。
前两个参数是输入区间的迭代器范围,第三个参数是输出区间的起始迭代器,第四个可选参数是自定义二元运算函数。
基础相邻差示例:
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> nums = {1, 3, 6, 10};
std::vector<int> diff(4);
// 计算相邻差,diff[0]=1, diff[1]=3-1=2, diff[2]=6-3=3, diff[3]=10-6=4
std::adjacent_difference(nums.begin(), nums.end(), diff.begin());
for (int num : diff) {
std::cout << num << " "; // 输出1 2 3 4
}
return 0;
}
使用注意事项
- 所有STL数值算法都需要包含<numeric>头文件,否则会出现编译错误。
- 使用inner_product、partial_sum、adjacent_difference时,输出区间需要有足够的空间存放结果,避免越界访问。
- 自定义运算函数需要满足结合律和交换律吗?对于accumulate的自定义运算,如果初始值类型和元素类型不一致,需要保证运算逻辑兼容两种类型,避免出现类型转换错误。
- 如果需要处理浮点数运算,初始值建议用对应类型的浮点值,比如0.0而不是0,避免整数除法等问题。
STL数值算法accumulateinner_productpartial_sumadjacent_difference修改时间:2026-06-29 07:24:27