当前位置: 首页 > news >正文

泛型算法概述

文章目录

    • 目录

    • 概要

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

http://www.jsqmd.com/news/201119/

相关文章:

  • 基于微信小程序的在线预约挂号系统(源代码+文档+PPT+调试+讲解)
  • 测试卡壳?掌握这7招,让你的业务代码“可测性”起飞!
  • 如何利用数据中台提升大数据领域的竞争力
  • 六大本科生论文抽检工具各有特色,用户可参考排名并依据查询需求选择
  • AI大模型:基于Python音乐推荐系统 数据分析可视化 协同过滤推荐算法 大数据毕业设计(全套源码+文档)建议收藏
  • Centos 7编译musl
  • 2025年程序员自由职业真相:赚钱更多了,还是更卷了?——一份基于300万人生存数据的年度报告
  • 不同功率电力设备,如何匹配对应的免维护吸湿器?
  • 基于CS架构的医院财务管理系统-计算机毕业设计源码+LW文档
  • AI大模型毕业设计:Django 淘宝商品预测系统 ARIMA预测 电商数据分析可视化 Hadoop spark(requests爬虫+销量时序预测 源码)✅
  • 关于软件外包平台,一些不太写在规则里的现实情况
  • 深度学习毕设选题推荐:人工智能基于机器学习的CNN卷积神经网络对海洋壳类生物识别
  • 基于Python的就业网站可视化系统设计与实现-计算机毕业设计源码+LW文档
  • 输入工作压力值,用可拓减压思维,输出5分钟+10分钟的碎片化减压方案,提升工作效率。
  • Flutter 数据库模块之 Draft 设计
  • 深度学习毕设选题推荐:基于python卷积神经网络训练识别牙齿是否健康机器学习
  • 北京收酒认准这家!亲测京城亚南酒业,童叟无欺太踏实 - 品牌排行榜单
  • 基于Python的商场停车管理系统的设计与实现-计算机毕业设计源码+LW文档分享
  • 一看就会的常间Mysql绕过方式
  • flask: uwsgi的启动、停止、重新加载
  • openEuler Intelligence 智能助手评测:华为云纯 CPU 环境实战部署 - 指南
  • 2025-2026年装配式内装企业怎么选?三大领军品牌优势解析与实用选购指南 - 匠子网络
  • UOJ #748 机器人表演
  • 2026 顶尖保险律师团队 TOP5:覆盖全场景纠纷,护航权益最大化 - 测评者007
  • 如何使用protobuf生成字节流payload
  • 2601C++,pmr管理内存
  • One-KVM 部署(S905l3a 盒子)
  • 2601,xmake的3.0.6更新
  • 2026年比较好的橡胶混炼胶厂家采购选型榜单 - 品牌鉴赏师
  • 新版微信4.1及以上dat文件转图片