sort 函数用法(日志11)

1.头文件

在C++中使用sort()函数需要使用#include<algorithm>头文件

algorithm意为“算法”,是C++的标准模板库中最重要的头文件之一。

2.基本使用方法

sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,默认升序。如果我们降序可以将cmp参数写为greater<int>()就是对int数组进行排序,当然<>中我们也可以写double、long、float等等。如果我们需要按照其他的排序准则,那么就需要我们自己定义一个bool类型的函数来传入。

比如我们对一个整型数组进行从大到小排序:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int num[10] = {6,5,9,1,2,8,7,3,4,0};
	sort(num,num+10,greater<int>());
	for(int i=0;i<10;i++){
		cout<<num[i]<<" ";
	}//输出结果:9 8 7 6 5 4 3 2 1 0
	
	return 0;
	
} 

3.自定义排序

bool cmp(int x,int y){
	return x%10>y%10 ;
}

将这个cmp函数作为参数传入sort()中即可实现了上述排序需求

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
	return x % 10 > y % 10;
}

int main(){
	int num[10] = {65,59,96,13,21,80,72,33,44,99};
	sort(num,num+10,cmp);
	for(int i=0;i<10;i++){
		cout<<num[i]<<" ";
	}//输出结果:59 99 96 65 44 13 33 72 21 80
	
	return 0;
	
} 

4.对结构体排序

sort()也可以对结构体进行排序,比如定义一个结构体含有学生的姓名和成绩的结构体Student,然后按照每个学生的成绩从高到底进行排序。首先将结构体定义为:

struct Student{
	string name;
	int score;
	Student() {}
	Student(string n,int s):name(n),score(s) {}
};

根据排序要求将排序准则函数写为:

bool cmp_score(Student x,Student y){
	return x.score > y.score;
}

完整代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

struct Student{
	string name;
	int score;
	Student() {}
	Student(string n,int s):name(n),score(s) {}
};

bool cmp_score(Student x,Student y){
	return x.score > y.score;
}

int main(){
	Student stu[3];
	string n;
	int s;
	for(int i=0;i<3;i++){
		cin>>n>>s;
		stu[i] = Student(n,s);
	}
	
	sort(stu,stu+3,cmp_score);
	
	for(int i=0;i<3;i++){
		cout<<stu[i].name<<" "<<stu[i].score<<endl;
	}
	
	return 0;
}

全部评论

相关推荐

12-06 20:42
已编辑
中山大学 前端工程师
现在秋招已结束,整理发一些面经笔经,回馈一下牛客社区。准备:9.3https://gw-c.nowcoder.com/api/sparta/jump/link?link=https%3A%2F%2Fwww.nowcoder.com%2Fexam%2Fcompany%3FcurrentTab%3Drecommand%26jobId%3D100%26selectStatus%3D0%26tagIds%3D9079这里一共有六份真题试卷。刚刚尝试在两个小时内回答腾讯音乐娱乐集团2024校园招聘-前端开发笔试(II),结果三道算法只做出了两道。后面看题解发现第三道直接暴力枚举就行了,第二道确实有点难度(甚至是暴力枚举都很难写)。但是我第三道由于被第二道搞没了心态,就直接放弃了(真在笔试的时候千万别放弃)。所以客观来看我还是能做出三道的。刚才仔细看了一下第二道题,应该是属于动态规划,感觉其实也没有想象中那么难,可以认为是需要进行细致分类讨论的子问题分解递推求解。虽然我很菜,但是我要怀有题目不难的信念,这样才能保持心态良好。发现有一套试卷打不开,那我这两天做四套题就好了。9.4今天大概就是继续刷题好了。做两套或者三套。花了四个小时才做好了一套卷,这次是把全部题目都通过了。虽然花的时间超了,但是也给自己增加了信心:我是有能力把所有题目都做出来的,包括十分困难的动态规划!但是动态规划的那道题目我就花了1小时40分钟,其实前面20分钟已经把递推公式写出来了。但是发现自己的编程还不够熟练,而且平台的js版本要滞后一些,有些方法用不了。做的过程中常把数组和字符串的方法搞混了,还有些方法直接忘了。比如我在想办法往数组的前面插入一个元素,想了10分钟竟没有办法,只好作弊查了一下MDN文档,原来要用splice(0,0,value)。所以还要抄一抄数据结构来熟练一下。后面这份试卷就没那么幸运了,而且最后一道看程序写结果的题目到现在也没有完全搞明白,只是知道有那么回事。其中比较奇妙的就是在函数内给没有声明过的变量赋值会变为globalThis的变量,而不管调用函数时的this是什么。function&nbsp;test()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getName&nbsp;=&nbsp;function()&nbsp;{&nbsp; Promise.resolve().then(() =>&nbsp;console.log(0));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};return&nbsp;this;&nbsp;}比如上面的getName会变为globalThis的一个变量(即全局变量)。不管是直接调用:test(),还是用call或apply指定this:test.call(obj)或test.apply(obj),getName都会变为globalThis的一个变量,而不会绑定到obj。此外,我认为TME2022校园招聘前端开发岗位笔试(II)的第一道算法的描述是错误的。“若当前节点为右儿子,会变成当前节点的双亲节点的右边相邻兄弟节点的左孩子节点。(如果当前节点的双亲节点已经是最右边的节点了,则会变成双亲节点同级的最左边的节点的左孩子节点)”,这里的右边相邻兄弟节点严格来说具有同一父节点的才算兄弟节点,不过测试用例则是把堂兄弟结点也算是兄弟节点了。9.5今天继续刷了TME的两套题目(实习生),有些题没做出来,不过也算是练了一下手感。做了五套题,现在大概已经有了些感觉,起码打字速度加快了一些,对算法的实现流畅了一些。其中最大的进步可能就是初步领略了动态规划。有许多题目败在了算法复杂度上,确实是基本功不够扎实导致的,因为实在是想不出优化的办法,看了一下题解经常会看到一些人说xxx方法这样,希望我也有一天可以做到这样。不过按目前的情况来看大概要到春招的时候了。笔试:刚才完成了TME的笔试,ac了三道题(一共四道)。四道都是比较基础的算法题,但是由于脑子不太好使,第三道一开始想歪了(想到了动态规划那边),最后用偏暴力的递推来解,但是计算子方阵权值的长度选取一下没想清楚,导致没做出来。不过想想还是算了,毕竟笔试AC了三道已经算是我历史上的最佳成绩了,毕竟之前算法一直是我的弱项,而之前的面试都是一道都做不出来的。这无疑给了我充分的信心:我不会被算法卡脖子!
查看7道真题和解析 投递腾讯音乐娱乐集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务