sort()函数的⽤法
sort(v.begin(),v.end(),cmp),它是⽤来对⼀组序列进⾏排序的。sort函数进⾏排序的为n*log2n,⽐冒泡之类的效率要⾼,包含在头⽂件为#include<algorithm>的c++标准库中。
其有三个参数,前两个参数是待排序区间;第三个参数可有可⽆(第三个参数代表⽐较规则),没有第三个参数的时候,sort()默认按升序排列,有第三个参数的时候,可以通过这个参数实现各种各样的排序,包括降序。sort()函数功能强⼤就是强⼤在第三个参数。
sort()函数除了可以对int型、char型、double型、字符串排序外,还可以实现对结构体、链表、pair、vector、等类型进⾏排序,但需要⾃⼰写⽐较函数。⽽且sort()既可以对数组排序,也可以对vector容器排序。下⾯就先说⼀下sort()只有两个参数时的⽤法,具体代码见下:
1 1 #include<iostream>
2 2 #include<vector>
3 3 #include<string>
4 4 #include<algorithm>
5 5 using namespace std;
6 6 int main()
7 7 {
8 8 int a[10]={6,5,4,8,3,9,7,10,1,2};
9 9 char b[8]={'h','z','l','n','m','r','d','g'};
1010 vector<double> v1;
1111 vector<string> v2;
1212
1327 sort(a+1,a+9); //可以指定任意合法的排序区间,不能越界
字符串比较函数实现1430
1535 sort(b,b+8); //对整个b排序
1638
1743 sort(v1.begin(),v1.end());//输⼊两个迭代器从⽽排序⼀个范围
1846
1951 sort(v2.begin(),v2.end());
20
2155 return 0;
2256 }
上⾯⼏种⽅法都是升序排列,要想按降序排列,有3种⽅法可以实现:
1. sort()函数只有两个参数时默认升序排列,在排完序后,再⽤reverse()函数把整个序列给翻转⼀下,这样序列就变成了降序。
127 sort(a+1,a+9); //可以指定任意合法的排序区间,不能越界
231 reverse(a+1,a+9);
3
439 sort(b,b+8); //对整个b排序
543 reverse(b,b+8);
6
746
851 sort(v1.begin(),v1.end());
955 reverse(v1.begin(),v1.end());
10
1163 sort(v2.begin(),v2.end());
1267 reverse(v2.begin(),v2.end());
2. 借助c++标准库来实现降序(或升序)。此时要包含头⽂件<functional>,<functional>头⽂件提供了⼀
些基于模板的⽐较函数对象,这⾥在排序的时候只⽤到了 greater<type>() 和 less<type>() 两个;让 greater<type>() 或
less<type>() 做sort()函数的第三个参数来实现升序或降序排列;其中greater<type>() ⽤于降序排列,less<type>()⽤于升序排列
114 sort(a,a+10,greater<int>());//降序排列
2
319 sort(a,a+10,less<int>());//升序排列
3. 第三个⽅法是⾃⼰写⼀个⽐较函数来实现升序或降序排列,并让这个⽐较函数做sort()函数的第三个参数;⽐较函数不仅能实现升序降序排列,还能实现其他的功能。
这就是sort()函数功能强⼤的地⽅,它可以扩展,⽽扩展的关键就是第三个参数。
先说⼀下⽐较函数,当你想实现特定⽐较⽅式的时候,就要⾃⼰定义⼀个返回bool值的⽐较函数了;这时sort()函数的第三个参数就是⼀个函数,如果它返回假值就交换操作对象的位置,返回真值的话操作对象位置不变。下⾯就⽤⽐较函数来实现升序降序的排列:
⾸先实现⽐较函数,注意⽐较函数参数数据类型要与需要⽐较的对象⼀致:
1 5 bool cmp1(int a,int b) //按降序排列
2 6 {
3 7 return a>b;
4 8 }
5 9
610 bool cmp2(int a,int b) //按升序排列
711 {
812 return a<b;
913 }
然后调⽤sort函数即可,此时不需要给⽐较函数传⼊参数,⽐较函数只是确定⽐较的规则。
123 sort(v.begin(),v.end(),cmp1); //这⾥不需要对⽐较函数cmp1传⼊参数
2
328 sort(v.begin(),v.end(),cmp2); 不需要对⽐较函数cmp2传⼊参数
另外⽐较函数可以⽤lambda表达式来写,这是leetcode hot100的⼀道题:
⾸先需要对people的vector按照hi进⾏从⼩到⼤的升序排列,对于相同的hi再按照ki进⾏从⼤到⼩的降序排序,我们使⽤sort中第三个参数的强⼤功能,就能够⾃⼰定义⽐较规则,⼀条语句就能实现我们需要的排序。代码如下:
可以定义创建匿名函数对象,从⽽简化编程⼯作。这就是sort函数的强⼤之处,在我们平时的编程当中也会经常使⽤到。1
//排序,⽅法使⽤lambda 表达式2 sort(people.begin(), d(), [](vector<int>& a, vector<int>& b) -> bool {return (a[0] < b[0]) || ((a[0] == b[0]) && (a[1] > b[1])); });
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论