欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++STL标准库学习笔记(一)sort

程序员文章站 2022-07-12 14:48:54
...

前言:

近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识、以后查找,也方便他人学习,两全其美,快哉快哉!

这里我会以中国大学慕课上北京大学郭炜老师的《程序设计与算法(一)C语言程序设计》中的十二章十三章为学习资料来做笔记。并且我会附上代码(只要我不偷懒的话)。若有没学习到的部分,我会继续找资料来更新学习笔记。

STL(Standard Template Library,标准模板库)

包含一些常用的算法如排序查找,和常用的数据结构如:可变长数组,链表,字典等。

优点:使用方便,(运行)效率较高

注意:若要使用其中的算法,需要#include<algorithm>

一、排序(sort)

本质上是用快速排序算法实现。

用法1:对基本类型的数组(int,double,char...)从小到大排序

Sort(数组名+n1, 数组名+n2);

n1和n2都是int类型表达式,可以包含变量

如果n1=0,则+n1可以不写

作用是将数组中下标范围为[n1,n2)的元素从小到大排序,下标为n2的元素不在排序区间内。

样例:

int main(int argc, char const *argv[])

{

    int a[] = {15,4,3,8,7,2,6};

    sort(a,a+7);//对整个数组从小到大排序

    for (int i = 0; i < 7; i++)

    {

        cout<<a[i]<<' ';

    }//结果:2 3 4 6 7 8 15

    cout<<endl;

    int b[] = {15,4,3,8,7,2,6};

    sort(b,b+3);

    for (int i = 0; i < 7; i++)

    {

        cout<<b[i]<<' ';

    }//结果:3 4 15 8 7 2 6

    cout<<endl;

    int c[] = {15,4,3,8,7,2,6};

    sort(c+2,c+5);

    for (int i = 0; i < 7; i++)

    {

        cout<<c[i]<<' ';

    }//结果:15 4 3 7 8 2 6

    cout<<endl;

    return 0;

}

用法2:对元素类型为T的基本类型数组从大到小排序:

sort(数组名+n1,数组名+n2,greater<T>);

样例:

int main(int argc, char const *argv[])

{

    int a[] = {15,4,3,8,7,2,6};

    int i;

    sort(a,a+7,greater<int>());

    for ( i = 0; i < 7; i++)

    {

        cout<<a[i]<<' ';

    }//结果:15 8 7 6 4 3 2

   

    return 0;

}

用法3:用自定义的排序规则,对任何类型T的数组排序

使用这种用法的原因:在我们自己定义了一些类/结构体的时候,自带的排序规则可能无法使用,或者说我们需要用我们自己的方法来排序,这个时候我们就要自定义排序规则了。

sort(数组名+n1,数组名+n2,排序规则结构名());

排序规则结构的定义方式:

struct 结构名

{

    bool operator()(const T & a1,const T & a2)const

    {

        //若a1应该在a2前面,则返回true

        //否则返回false

    }

};

在bool operator()(const T & a1,const T & a2)const这一句中,要记得写上const,否则可能会有奇奇怪怪的错误。

样例(自定义规则排序):

struct rule1//从大到小排序

{

    bool operator()(const int & a1,const int & a2)const

    {

        return a1 > a2;

    }

};

struct rule2//按个位数从大到小排序

{

    bool operator()(const int & a1,const int & a2)const

    {

        return a1%10 < a2%10;

    }

};

void Print(int a[],int size)

{

    for (int i = 0; i < size; i++)

    {

        cout<<a[i]<<",";

    }

    cout<<endl;

}

int main(int argc, char const *argv[])

{

    int a[] = {12,45,3,98,21,7};

    sort(a,a+sizeof(a)/sizeof(int));//从小到大排序

    cout<<"1)";Print(a,sizeof(a)/sizeof(int));

    //结果:1)3,7,12,21,45,98,

    sort(a,a+sizeof(a)/sizeof(int),rule1());//从大到小排序

    cout<<"2)";Print(a,sizeof(a)/sizeof(int));

    //结果:2)98,45,21,12,7,3,

    sort(a,a+sizeof(a)/sizeof(int),rule2());//按个位数从小到大排序

    cout<<"3)";Print(a,sizeof(a)/sizeof(int));

    //结果:3)21,12,3,45,7,98,

    return 0;

}

样例2(结构体数组排序):

struct Student

{

    char name[20];

    int id;

    double gpa;

};

Student students [] =

{

    {"Jack",112,3.4},{"Mary",102,3.8},{"Mary",117,3.9},

    {"Ala",333,3.5},{"Zero",101,4.0}

};

//排序范围是[n1,n2)的元素

//在使用二分查找时,查找规则必须和排序规则一致

struct StudentRule1//按姓名从小到大排

{

    bool operator()(const Student & s1,const Student & s2)const{

        if (stricmp(s1.name,s2.name) < 0)

        {

            return true;

        }

        return false;

    }

};

struct StudentRule2//按id从小到大排

{

    bool operator()(const Student & s1,const Student & s2)const{

        return s1.id < s2.id;

    }

};

struct StudentRule3//按gpa从高到低排

{

    bool operator()(const Student & s1,const Student & s2)const{

        return s1.gpa > s2.gpa;

    }

};

void PrintStudents(Student s[],int size)

{

    for (int i = 0; i < size; i++)

    {

        cout<<"("<<s[i].name<<","<<s[i].id<<","<<s[i].gpa<<")";

    }

    cout<<endl;

}

int main()

{

    int n = sizeof(students)/sizeof(Student);



    sort(students,students+n,StudentRule1());

    PrintStudents(students,n);

    //结果:(Ala,333,3.5)(Jack,112,3.4)(Mary,102,3.8)(Mary,117,3.9)(Zero,101,4)

    sort(students,students+n,StudentRule2());

    PrintStudents(students,n);

    //结果:(Zero,101,4)(Mary,102,3.8)(Jack,112,3.4)(Mary,117,3.9)(Ala,333,3.5)

    sort(students,students+n,StudentRule3());

    PrintStudents(students,n);

    //结果:(Zero,101,4)(Mary,117,3.9)(Mary,102,3.8)(Ala,333,3.5)(Jack,112,3.4)

    return 0;

}

相关标签: STL库 stl c++