1、C++ sort()排序函数
位于<algorithm>
头文件中
sort (first, last) | 对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。 |
该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater<T>
降序排序规则),甚至还可以自定义排序规则。
sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 sort() 函数:
- 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
- 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持
<
小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符; - sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。
sort() 函数有 2 种用法,其语法格式分别为:
//对 [first, last) 区域内的元素做默认的升序排序 void sort (RandomAccessIterator first, RandomAccessIterator last); //按照指定的 comp 排序规则,对 [first, last) 区域内的元素进行排序 void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
其中,first 和 last 都为随机访问迭代器,它们的组合 [first, last) 用来指定要排序的目标区域;另外在第 2 种格式中,comp 可以是 C++ STL 标准库提供的排序规则(比如 std::greater<T>),也可以是自定义的排序规则
对于排序规则:
(1)、C++ STL 标准库提供的排序规则
less<数据类型>()//从小到大排序
greater<数据类型>()//从大到小排序
(2)自定义函数:返回值是bool型
#include<iostream>
#include<algorithm>
#include"cstring"
using namespace std;
typedef struct student{
char name[20];
int math;
int english;
}Student;
bool cmp(Student a,Student b);
main(){
//先按math从小到大排序,math相等,按english从大到小排序
Student a[4]={{"apple",67,89},{"limei",90,56},{"apple",90,99}};
sort(a,a+3,cmp);
for(int i=0;i<3;i++)
cout<<a[i].name <<" "<<a[i].math <<" "<<a[i].english <<endl;
}
bool cmp(Student a,Student b){
if(a.math >b.math )
return a.math <b.math ;//按math从小到大排序
else if(a.math ==b.math )
return a.english>b.english ; //math相等,按endlish从大到小排序23
}
2、find() 函数
find() 函数本质上是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。
头文件:algorithm
语法格式:
InputIterator find (InputIterator first, InputIterator last, const T& val);
其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。
适用对象:普通数组、所有的序列式容器
返回值:返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
注意:
find() 函数的底层实现,其实就是用==
运算符将 val 和 [first, last) 区域内的元素逐个进行比对。这也就意味着,[first, last) 区域内的元素必须支持==
运算符。