CHAPTER_6 C++STL相关
6.9头文件algorithm
(6)sort()
sort是用来排序的函数,它根据具体情况使用不同的排序算法,进而达到高效。sort()的使用方式如下:
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(选填));
可以看到,sort的参数有3个,其中前两个必填,它们确定一个左闭右开的区间,而比较函数则按需要填写。如果不写比较函数,则默认按递增排序。
示例如下:
double a[4]={3,2,1,0};
sort(a,a+3); //前三个元素按默认递增排序
for(int i=0;i<4;i++){
cout<<a[i];
}
//输出结果:1230
vector<char> v={'c','a','d','b'};
sort(v.begin(),v.begin()+3); //以迭代器的方式将前三个字符按字典序排序
for(int i=0;i<4;i++){
cout<<v[i];
}
//输出结果:acdb
我们需要注意的是,如果要用sort对序列排序,那么序列中的元素一定要有可比性。对于我们自定义的结构体或者类,它们本身并没有可比性,我们就需要人为制定比较的规则,sort的第三个参数就是用来实现自定义的规则。
(7)比较函数cmp
下面讨论对基本数据类型、结构体、STL容器进行自定义规则排序时cmp的写法。
基本数据类型:
对于基本类型,我们如果不填比较函数,那么它们按照默认递增排序。如果我们需要让它们递减排序,需要怎么做呢?
如果要递减排序,我们要编写比较函数cmp,来“告诉”sort何时交换元素。例如:
bool cmp(double a,double b) {
return a>b; //可以理解为当a>b时,a放在b前面
}
int main() {
double a[4]={1.0,2.0,3.0,4.0};
sort(a,a+4,cmp);
//sort已经将序列递减排序
return 0;
}
结构体数组:
在我们自定义的结构体或者类中,有不止一个的成员。如果我们需要对这个结构体数组(类)排序,我们可以制定按多关键字的复杂规则排序。例如:
我们有如下结构体数组:
struct node {
int x,y;
}n[5];
如果我们想要这个数组按照x的大小递减排序,我们可以按如下编写cmp函数:
bool cmp(node a,node b) {
return a.x>b.x;
}
如果排序规则更复杂一些,我们需要按x递减排序,如果x相等,则按y的大小递增排序,则cmp函数的编写应该如下:
bool cmp(node a,node b) {
if(a.x!=b.x)
return a.x>b.x;
else
return a.y<b.y;
}
这里的cmp函数首先判断结构体内的x是否相等,如果不等则x大的放在前面,如果x相等,则y小的放在前面。
容器的排序:
在STL标准容器中,只有vector、string、deque是可以使用sort的。因为只有这三种容器才支持随机访问。像queue、stack、list这样的容器,是严格按照数据结构定义设计的,它们并不支持排序。而set、map这类容器是用红黑树实现的,它们本身有序,故不能使用sort排序。
STL的sort排序方式并没有什么特别的,因为三种容器都支持随机访问,故可以像普通数组那样直接用下标运算当作sort的前两个参数。当然它们还可以使用迭代器来当作sort的参数。例如:
vector<int> v={3,2,1,0};
sort(v,v+4); //按照下标的方式将一到四个元素排序
sort(v.begin(),v.end()); //按照迭代器的方式排序
然后我们再来看string的排序。如果省略sort的第三个参数,那么string内部默认按字典序排序。对于string数组的排序也同样如此,例如:
string s[3]={"bbbb","cc","aaa"};
sort(s,s+3);
for(int i=0;i<3;i++){
cout<<s[i]<<' ';
}
//输出结果:aaa bbbb cc
如果我们想要string按照字符串长度排序,我们可以如下编写cmp函数:
bool cmp(string s1;string s2) {
return s1.size()<s2.size(); //长度小的放在前面
}
本文介绍了C++ STL中的sort函数,用于对序列进行排序,包括基本数据类型的排序、结构体数组的多关键字排序以及STL容器如vector和string的排序。还讲解了如何编写自定义比较函数cmp实现递减排序和复杂排序规则,并强调了sort函数只能用于支持随机访问的容器。
226

被折叠的 条评论
为什么被折叠?



