C++ <algorithm>
实用向总结
注 :本篇文章属于新手实用向 ,只针对算法函数的简单使用方法进行介绍 。
如有错误 ,欢迎指正 。
一、概念澄清
- 本文会大量提到“存在逻辑大小”和“不存在逻辑大小”这两个词 ,在这里做一些说明 。
- 存在逻辑大小 :指本身存在大小关系 ,可以直接比较的变量 。比如
int
型、float
型、char
型 等等 。3 < 5
,8.8 > 7.1
,'c' > 'a'
…… ……
- 不存在逻辑大小 :主要是指用户自定义的数据类型 。比如 ,自定义一个
student
结构体,包括两个数据成员name
和score
,用student
定义两个变量stu1
和stu2
,这两个变量,本身没有大小关系的逻辑,因为没有比较标准 。
- 对
cmp
函数简要说明 。
cmp
函数,其实就是用户自定义的一个比较标准 。它的用途主要有二 :
- 给不存在逻辑大小的变量(例如结构体变量)树立比较标准 ,从而可以进行比较 。
- 改变原有的比较标准 ,树立新标准 。(例如原本
sort
函数默认从小到大排序 ,如果要改为从大到小排序 ,就可以用cmp
函数)
cmp
函数的写法 :bool cmp(const Type1 &a,const Type2 &b){ return a.i<b.i; //此处是一个符合自己意愿的逻辑表达式即可 }
二、函数的使用
注 :以下只介绍 5种简单的函数 。所有函数使用之前应包含头文件<algorithm>
并使用标准命名空间std
#include <algorithm>
#include <iostream>
using namespace std;
1 . max
和min
系列函数
以下用
a
,b
表示两个元素 ,用Begin
和End
表示一个范围的开头和结尾 。
max(a,b) //返回a,b中较大者
max_element(Begin,End,cmp) //( cmp 可不填)(按照 cmp 的标准)返回范围内最大者或最大者的迭代器
min(a,b) //返回a,b中较小者
min_element(Begin,End,cmp) //( cmp 可不填)(按照 cmp 的标准)返回范围内最小者或最小者的迭代器
2 . sort
系列函数
以下用
Begin
和End
表示一个范围的开头和结尾 。并且End
表示要排序的末尾元素的下一个位置 。
sort(Begin,End) //对范围内元素进行排序(默认从小到大)
sort(Begin,End,cmp) //按照 cmp 的标准排序
is_sorted(Begin,End) //检查范围内元素是否已排序 (默认从小到大),若已排序则返回 true
is_sorted(Begin,End,cmp) // 按照 cmp 的标准检查范围内元素是否已排序 , 若已排序则返回 true
3 . swap
系列函数
以下
a
和b
可代表两个变量 ,两个数组 ,两个容器 ,两个迭代器等 。
swap(a,b) //交换a和b的元素
swap(aBegin,aEnd,bBegin) //交换a与b中从aBegin到aEnd之间的元素
iter_swap(a,b) //交换两个迭代器a和b所指向的元素
4 . lower_bound
与upper_bound
函数
以下用
Begin
和End
表示一个范围的开头和结尾 。并且End
表示被查找的末尾元素的下一个位置 ;用num
表示要查找的元素 。并且必须保证范围内的元素已经排好序 。
lower_bound(Begin,End,num) //返回>=num的第一个元素的位置的指针或迭代器 。如果所有元素都小于num ,则返回End 。
upper_bound(Begin,End,num) //返回<=num的第一个元素的位置的指针或迭代器 。如果所有元素都大于num ,则返回End 。
使用技巧 :通过返回的地址减去起始地址Begin,得到找到数字在数组(或容器)中的下标。
5 . transform
函数
- 一元转换 :将
一元函数
(用op1
表示)应用于容器1
(或数组1
)中的每一个元素,并将结果储存于容器2
(或数组2
)内 。容器2
(或数组2
)可与容器1
(或数组1
)是同一个容器(或数组)。
transform(Begin_1,End_1,Begin_2,op1) //对Begin_1到End_1内的元素应用op1函数 ,并将结果保存至以Begin_2开头的容器(或数组)内 。
- 二元转换 :将
二元函数
(用op2
表示)应用于容器1
(或数组1
)和容器2
(或数组2
)中的每一个元素,并将结果储存于容器3
(或数组3
)内 。容器3
(或数组3
)可与容器1
(或数组1
),容器2
(或数组2
)是同一个容器(或数组)。
transform(Begin_1,End_1,Begin_2,Begin_3,op2) //对Begin_1到End_1及从Beign_2开始的元素应用op2函数 ,并将结果保存至以Begin_3开头的容器(或数组)内 。