STL数值算法怎么使用 掌握accumulate inner_product等技巧

来源:图像处理网作者:比特币程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《STL数值算法怎么使用 掌握accumulate inner_product等技巧》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《STL数值算法怎么使用 掌握accumulate inner_product等技巧》有用,将其分享出去将是对创作者最好的鼓励。

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

STL数值算法怎么使用 掌握accumulate inner_product等技巧

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。