news 2026/5/30 15:21:48

泛型算法概述

作者头像

张小明

前端开发工程师

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/5/29 4:35:09

大数据领域数据合规:提升竞争力的关键

大数据领域数据合规&#xff1a;提升竞争力的关键关键词&#xff1a;数据合规、大数据、隐私保护、数据治理、企业竞争力、GDPR、个人信息保护法摘要&#xff1a;在数据成为“新型石油”的今天&#xff0c;企业如何合法、安全地挖掘数据价值&#xff1f;本文将从“数据合规”这…

作者头像 李华
网站建设 2026/5/29 18:45:54

ollama部署本地模型

ollama本地部署deepseek模型使用ollama拉取目标模型查看本地模型测试模型能否正常对话使用curl命令测试模型使用ollama拉取目标模型 ollama pull deepseek-r1:7b如图所示 查看本地模型 ollama list可以看到deepseek-rz:7b已经下载下来了 测试模型能否正常对话 ollama ru…

作者头像 李华
网站建设 2026/5/29 4:35:25

基于SpringBoot协同过滤兼职推荐小程序源码设计与文档

前言基于 Spring Boot 的协同过滤兼职推荐小程序&#xff0c;聚焦灵活就业与兼职市场 “供需精准匹配、高效对接、安全保障” 的核心需求&#xff0c;针对传统兼职市场 “信息不对称、匹配度低、交易风险高” 的痛点&#xff0c;构建覆盖兼职求职者、用工方、平台运营者的全流程…

作者头像 李华
网站建设 2026/5/30 10:22:40

分时电价环境下用户负荷需求响应分析方法Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华