栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《算法笔记》读书记录DAY

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《算法笔记》读书记录DAY

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< v={'c','a','d','b'};
sort(v.begin(),v.begin()+3);     //以迭代器的方式将前三个字符按字典序排序
for(int i=0;i<4;i++){
    cout< 

我们需要注意的是,如果要用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 

这里的cmp函数首先判断结构体内的x是否相等,如果不等则x大的放在前面,如果x相等,则y小的放在前面。

容器的排序:

在STL标准容器中,只有vector、string、deque是可以使用sort的。因为只有这三种容器才支持随机访问。像queue、stack、list这样的容器,是严格按照数据结构定义设计的,它们并不支持排序。而set、map这类容器是用红黑树实现的,它们本身有序,故不能使用sort排序。

STL的sort排序方式并没有什么特别的,因为三种容器都支持随机访问,故可以像普通数组那样直接用下标运算当作sort的前两个参数。当然它们还可以使用迭代器来当作sort的参数。例如:

vector 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< 

如果我们想要string按照字符串长度排序,我们可以如下编写cmp函数:

bool cmp(string s1;string s2) {
    return s1.size() 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311705.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号