【C++语法进阶】C++模板和泛型编程(长期更新中)

C++模板与泛型编程

泛型算法

一种标准库算法,对容器(包括string)通用,利用迭代器操作,故使用泛型算法时无视容器特性

主要存放在头文件:<algorithm><numeric>

以下未标注的方法都是包含在algorithm头文件中的

常用函数

find()、

只读型
find(b, e, val)
  • 作用:寻找vec[b,e)区间中是否包含val元素,b,e为迭代器

  • 返回类型为val参同类型的指针变量

  • 找到就返回第一个值为val的元素指针,没找到返回vec.end()

find_if(b, e, condition)
  • 在vec[b,e)区间寻找满足condition的元素
  • 返回一个迭代器
  • condition可以为函数,lambda表达式
count(b, e, val)
  • 作用:寻找vec[b,e)区间中有多少个val元素,b,e为迭代器
  • 返回的是结果数量
accumlate(b, e , startval)
  • 头文件:<numeric>
  • 结果 = startval + vec[b] + …+ vec[e-1]
  • 在调用时,默认结果和startval同一类型,不会检查vec中的元素和startval是否可以隐式转换。
写操作
fill(b, e, val)
  • void类型

  • 把vec[b, e)中的所有元素全部赋值为val

fill_n(b, size, val)
  • void类型
  • 从vec[b]开始,赋值size个元素,令其值为val

!注意!:以上函数要求我们写的范围不能大于容器原有范围,且系统不会检查是否未定义,所以!不能用以上函数给空容器填充。

排序
sort(b, e)
  • 默认按从小到大的顺序排序,vec[b, e)
  • 可以在sort(b,e,func)第三位使用一个谓词,用于比较判断
        auto compare = [](const vector<int> & a, const vector<int> & b)
        {

            if (a[0] == b[0])
            {
                return a[1] < b[1];
            }
            if (a[0] > b[0])
            {
                return true;
            }
            return false;
        };
// 比较数组大小,第一位大的在前,若第一位相同,第二位较小的在前
        std::sort(people.begin(), people.end(),compare);
reverse(b, e)
  • 将vec[b,e]逆转
唯一
unique(b, e)
  • 将vec[b,e] 中所有不重复的元素放到前面
  • 因为泛型算法操作的都是迭代器,而非容器,所以不会执行删除操作。
遍历及操作
for_each(b , e, func)
  • 将vec[b,e)中元素遍历传参到func中
  • func可为外部函数名(注意别带括号),也可以直接在其中写lambda表达式
  • 不会改变容器中的值,通常用于遍历
transform(b, e, target_b, func)
  • 对vec[b, e)中的元素作为参数传递到func(为函数对象或函数指针)中进行操作
  • target_b作为目标容器的首位,存储vec[b, e)func后的结果
  • 目标容器的大小必须足够大,能够存储转换后的所有元素。
  • std::transform() 函数不会改变输入范围中的元素值,它只是对每个元素应用转换操作,并将结果存储到目标范围中
  • 目标范围可以和输入范围相交(即,可为同一容器)【非常适合用于滑动窗口,动态规划】

数学公式

gcd(int , int)
  • <numeric> 头文件
  • 求最大公因数。
lower_bound(b, e, target)
  • 在有序序列中查找第一个大于或者等于给定值的元素的位置

  • 找到则返回该迭代器。
    int)

  • <numeric> 头文件

  • 求最大公因数。

lower_bound(b, e, target)
  • 在有序序列中查找第一个大于或者等于给定值的元素的位置
  • 找到则返回该迭代器。
  • [b, e) 为查找范围,是两个迭代器
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值