中卫市网站建设_网站建设公司_Angular_seo优化
2026/1/5 21:56:29 网站建设 项目流程

文章目录

    • 目录

    • 概要

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询