• C++STL(标准模板库)笔记---sort排序


    STL(标准模板库)笔记---sort排序

    本系列是观看北大郭炜老师C++程序与算法课程的笔记,用于复习与巩固。

    STL概述

    • STL:(Standard Template Library) 标准模板库

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

    • 使用方便,效率较高

    • 要使用其中的算法,需要' #include < algorithm > '

    用sort进行排序(用法一)

    • 对基本类型的数组从小到大排序:
      sort( 数组名+n1, 数组名+n2);
      n1 和 n2都是int类型的表达式,可以包含变量;
      如果n1=0,则+n1可以不写。
      将数组中下标范围为[n1,n2)的元素从小到大排序。下标为n2的元素不在排序区间内(即左闭右开)。
      例:
    1. int a[] = {15,4,3,9,7,2,6};
      sort(a,a+3); // 结果:{3,4,15,9,7,2,6}
    2. int a[] = {15,4,3,9,7,2,6};
      sort(a+2,a+5); //结果:{15,4,3,7,9,2,6}

    用sort进行排序(用法二)

    • 对元素类型为T的基本类型数组从大到小排序:
      sort(数组名+n1,数组名+n2,greater());
      int a[] = {15,4,3,9,7,2,6};
      sort(a+1,a+4,greater()); // 结果:{15,9,4,3,7,2,6}

    用sort进行排序(用法三)

    • 用自定义的排序规则,对任何类型T的数组排序:
      sort(数组名+n1,数组名+n2,排序规则结构名());

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

    struct 结构名
    {
    	bool operator()( const T & a1,const T & a2) const {
    		//若a1应该在a2前面,则返回true。
    		//否则返回false。
    	}
    }; 
    

    在operator()比较规则里,尽量加上const,以防出现编译错误

    排序规则返回 true,意味着 a1 必须在 a2 前面;
    返回 false,意味着 a1 并非必须在 a2 前面;
    排序规则的写法,不能造成比较 a1,a2 返回 true 比较 a2,a1 也返回 true
    否则sort会 runtime error;
    比较 a1,a2 返回 false 比较 a2,a1 也返回 false,则没有问题。

    示例代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    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 a[] = { 12,45,3,98,21,7};
    	sort(a,a+sizeof(a)/sizeof(int)); //从小到大
    	cout << "1) "; Print(a,sizeof(a)/sizeof(int));
    	sort(a,a+sizeof(a)/sizeof(int),Rule1()); //从大到小
    	cout << "2) "; Print(a,sizeof(a)/sizeof(int));
    	sort(a,a+sizeof(a)/sizeof(int),Rule2()); //按个位数从小到大
    	cout << "3) "; Print(a,sizeof(a)/sizeof(int));
    	return 0;
    }
    

    输出结果:

    1) 3,7,12,21,45,98,
    2) 98,45,21,12,7,3,
    3) 21,12,3,45,7,98,
    

    还可以对结构进行排序:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    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}};
    
    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;
    	}
    };
    
    int main()
    {
    	int n = sizeof(students) / sizeof(Student);//求出数组的个数
    	sort(students,students+n,StudentRule1()); //按姓名从小到大排
    	PrintStudents(students,n);
    	sort(students,students+n,StudentRule2()); //按id从小到大排
    	PrintStudents(students,n);
    	sort(students,students+n,StudentRule3()); //按gpa从高到低排
    	PrintStudents(students,n);
    	return 0;
    }
    

    输出排序结果:

    (Ala,333,3.5) (Jack,112,3.4) (Mary,102,3.8) (Mary,117,3.9) (Zero,101,4)
    (Zero,101,4) (Mary,102,3.8) (Jack,112,3.4) (Mary,117,3.9) (Ala,333,3.5)
    (Zero,101,4) (Mary,117,3.9) (Mary,102,3.8) (Ala,333,3.5) (Jack,112,3.4)
    
  • 相关阅读:
    01 WEB白帽子Python入门
    07 SSRF漏洞
    JAVA基础学习day04--IDEA、方法
    一些常用的计算机快捷指令
    记录一次xss平台的安装
    upload-labs
    蓝队防护基础
    bagecms的代码审计
    window入侵排查基本
    常用端口总结
  • 原文地址:https://www.cnblogs.com/shuai841952238/p/12818307.html
Copyright © 2020-2023  润新知