news 2026/9/3 3:37:06

泛型算法概述

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
泛型算法概述

文章目录

    • 目录

    • 概要

    • accumulate

    • copy

    • 小结

概要

泛型算法是C++标准库里的又一重要的组成部分,泛型算法之所以被称为“算法”,是因为它们实现了一些经典算法的公共接口,例如:排序搜索,“泛型”则意味着它们能够用于不同类型的元素和多种容器类型,不仅如此还可以其他类型的序列。泛型算法与C++标准库中其他的内容之间的关系如下图所示。

大多数泛型算法都定义在头文件algorithm,不仅如此,标准库还在头文件numeric中定义了一组数值泛型算法。一般情况下,大多数算法并不直接操作容器,而是通过两个迭代器所指定的范围进行操作。例如:

#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int val=42; vector<int>v(n,0); auto result=find(v.begin(),v.end(),val); return 0 }

auto 是C++11新特性的内容,能够让编译器自动地帮我们判断类型,在这段代码中如果查找到val则返回指向val的迭代器,此迭代器可以看做一个指针,如果未查找到则返回容器的尾迭代器,即v.end()。从此例可以看出算法并不直接通过操作容器来对元素进行操作,而是通过操作迭代器间接操作容器中的元素,如下图

下面介绍一些常见的算法

count和count_if

count是头文件algorithm中的一个算法,它类似于find,接受一个迭代器和一个值作为参数。其返回给定值在容器中的次数。如:

#include<iostream> #include<vector> using namespace std; int main() { vector<int>v(5,0);//设置容器大小为5,同时容器中有n个0 for(int i=0;i<4;++i) { v[i]=i;//将0-3放入到容器中 } int val=0; int c=count(v.begin(),v.end(),val); cout<<c<<endl;//输出容器中值为0的个数,为2 return 0; }

此count接收从v.begin()和v.end()这个范围内的迭代器,并统计有多少个值为val的个数,并返回这个个数。

说到count,不得不谈及它的兄弟count_if,count_if与count的不同之处在于,count_if的第三个参数接受一个bool类型的一元谓词,即统计满足此谓词的数的个数,该谓词可以为函数指针、函数对象、Lambda 表达式。

如:

#include <iostream> #include <vector> #include <algorithm> int main() { // 1. 初始化一个简单的整数向量(待统计容器) std::vector<int> nums = {1, 3, 5, 7, 2, 4, 6, 8, 9, 10}; // 2. 使用 count_if 统计「偶数」的个数(Lambda 表达式作为条件谓词) // 格式:count_if(容器起始迭代器, 容器结束迭代器, 条件谓词) int even_count = std::count_if( nums.begin(), // 遍历起始位置(第一个元素) nums.end(), // 遍历结束位置(最后一个元素的下一个,左闭右开) [](int num) { // Lambda 表达式:接收单个元素,返回 bool 类型条件 return num % 2 == 0; // 条件:判断是否为偶数 } ); // 3. 输出统计结果 std::cout << "向量中的偶数个数:" << even_count << std::endl; return 0; }

accumulate

accumulate是一种只读算法,它定义在头文件numeric中,此算法接受三个参数,前两个指出需要求和的元素的范围,第三个参数是和的初值。如:

#include<iostream> #include<vector> #include<numeric>//accumulate所在的头文件numeric int main() { vector<int>v(5,1) int sum=accumulate(v.begin(),v.end(),0);//求v.begin()到v.end()这个范围中的数的和 std::cout<<sum<<endl;//输出所求的和 5 return 0; }

copy

copy又叫拷贝算法,copy是一个向目的位置迭代器的输出序列中的元素写入数据的算法,此算法将输入范围中的元素拷贝到目的序列中。并且传递给copy的目的序列至少要包含于输入序列一样多的元素。我们可以用copy实现内置数组的拷贝,例如:

#include<iostream> #include<algorithm> int main() { int arr[]={0,1,2,3,4}; int a[sizeof(arr)/sizeof(*arr)];//arr大小与a一样 auto ret=copy(begin(arr),end(arr),a);//copy返回的是其目的位置迭代器(递增后的值),即a尾元素之后的位置,容器则同理 return 0; }

小结

泛型算法是C++标准库中的重要组成部分,它们能提供一些经典算法的接口,方便程序员对元素进行操作,并且算法并不直接通过操作容器来操作数据,而是通过操作迭代器间接操作数据。文章如有错误欢迎私信我,我会及时解决,如果我的内容对你有帮助和启发,请点赞评论收藏。你们的支持就是我更新最大的动力,那么我们下期再见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 21:13:15

什么是‘智能法律助手’:构建一个支持多轮反问、证据提取、合规对比的‘递归式’合同审查图

各位法律科技的探索者、编程的实践者们&#xff0c;大家好。今天&#xff0c;我们将深入探讨一个前沿且充满挑战的领域&#xff1a;构建一个智能法律助手。我们所构想的这个助手&#xff0c;并非仅仅停留在关键词搜索或简单的信息提取层面&#xff0c;而是要能支持多轮反问、精…

作者头像 李华
网站建设 2026/9/2 8:46:53

基于SpringBoot的就业推荐系统(毕业设计项目源码+文档)

课题摘要基于 Spring Boot 的就业推荐系统&#xff0c;聚焦高校就业服务 “精准匹配、高效对接、个性化指导” 的核心需求&#xff0c;针对传统就业推荐 “信息不对称、匹配度低、指导滞后” 的痛点&#xff0c;构建覆盖毕业生、用人单位、就业指导中心的全流程就业服务生态。系…

作者头像 李华