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) 为查找范围,是两个迭代器