<algorithm>中sort()函数的用法
先说一下,本篇文章我没有讲sort()实现排序的原理,我写在另一篇文章中了,如果想了解的话,可以看一下,附上链接:https://www.cnblogs.com/buanxu/p/12772700.html
sort(v.begin(),v.end(),cmp),它是用来对一组序列进行排序的;有三个参数,前两个参数是待排序区间;第三个参数可有可无(第三个参数代表比较规则),
没有第三个参数的时候,sort()默认按升序排列,有第三个参数的时候,可以通过这个参数实现各种各样的排序,包括降序。sort()函数功能强大就是强大在
第三个参数,后面会讲到。
sort()函数除了可以对int型、char型、double型、字符串排序外,还可以实现对结构体、链表、pair、vector、等类型进行排序,但需要自己写比较函数,后面
也会讲到。而且sort()既可以对数组排序,也可以对vector容器排序。下面就先说一下sort()只有两个参数时的用法,看代码吧,写的比较详细,列举了多种情况
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int a[]={,,,,,,,,,};
char b[]={'h','z','l','n','m','r','d','g'};
vector<double> v1;
vector<string> v2;
v1.push_back(3.6);
v1.push_back(0.8);
v1.push_back(-0.5);
v1.push_back(-2.4);
v1.push_back(1.2);
v2.push_back("abcde");
v2.push_back("fdbcde");
v2.push_back("apcde");
v2.push_back("fdbcdc");
v2.push_back("fdbc"); cout<<"对a排序前:";
for(int i=;i<;i++)
cout<<a[i]<<" ";
cout<<"\n对a排序后:";
sort(a+,a+); //可以指定任意合法的排序区间,不能越界
for(int i=;i<;i++)
cout<<a[i]<<" "; cout<<"\n\n对b排序前:";
for(int i=;i<;i++)
cout<<b[i]<<" ";
cout<<"\n对b排序后:";
sort(b,b+); //对整个b排序
for(int i=;i<;i++)
cout<<b[i]<<" "; cout<<"\n\n对v1排序前:";
for(int i=;i<v1.size();i++)
cout<<v1[i]<<" ";
cout<<"\n对v1排序后:";
sort(v1.begin(),v1.end());
for(int i=;i<v1.size();i++)
cout<<v1[i]<<" "; cout<<"\n\n对v2排序前:";
for(int i=;i<v2.size();i++)
cout<<v2[i]<<" ";
cout<<"\n对v2排序后:";
sort(v2.begin(),v2.end());
for(int i=;i<v2.size();i++)
cout<<v2[i]<<" ";
cout<<"\n";
return ;
}
结果如下:
上面列举了几种常见数据类型排序后的结果,但是它们都是按升序排列的,要想按降序排列,有3种方法。为了给大家讲的更详细一点,在第一个方法中我
用了好几种数据类型;后面两种方法就只用了一种数据类型,以减少篇幅。
1. sort()函数只有两个参数时默认升序排列,在排完序后,再用reverse()函数把整个序列给翻转一下,这样序列就变成了降序;把上面的代码改一下就好了
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int a[]={,,,,,,,,,};
char b[]={'h','z','l','n','m','r','d','g'};
vector<double> v1;
vector<string> v2;
v1.push_back(3.6);
v1.push_back(0.8);
v1.push_back(-0.5);
v1.push_back(-2.4);
v1.push_back(1.2);
v2.push_back("abcde");
v2.push_back("fdbcde");
v2.push_back("apcde");
v2.push_back("fdbcdc");
v2.push_back("fdbc"); cout<<"对a排序前:";
for(int i=;i<;i++)
cout<<a[i]<<" ";
cout<<"\n对a默认排序后:";
sort(a+,a+); //可以指定任意合法的排序区间,不能越界
for(int i=;i<;i++)
cout<<a[i]<<" ";
cout<<"\n对a降序排序后:";
reverse(a+,a+);
for(int i=;i<;i++)
cout<<a[i]<<" "; cout<<"\n\n对b排序前:";
for(int i=;i<;i++)
cout<<b[i]<<" ";
cout<<"\n对b默认排序后:";
sort(b,b+); //对整个b排序
for(int i=;i<;i++)
cout<<b[i]<<" ";
cout<<"\n对b降序排序后:";
reverse(b,b+);
for(int i=;i<;i++)
cout<<b[i]<<" "; cout<<"\n\n对v1排序前:";
for(int i=;i<v1.size();i++)
cout<<v1[i]<<" ";
cout<<"\n对v1排序后:";
sort(v1.begin(),v1.end());
for(int i=;i<v1.size();i++)
cout<<v1[i]<<" ";
cout<<"\n对v1默认排序后:";
reverse(v1.begin(),v1.end());
for(int i=;i<v1.size();i++)
cout<<v1[i]<<" "; cout<<"\n\n对v2排序前:";
for(int i=;i<v2.size();i++)
cout<<v2[i]<<" ";
cout<<"\n对v2排序后:";
sort(v2.begin(),v2.end());
for(int i=;i<v2.size();i++)
cout<<v2[i]<<" ";
cout<<"\n对v2默认排序后:";
reverse(v2.begin(),v2.end());
for(int i=;i<v2.size();i++)
cout<<v2[i]<<" ";
cout<<"\n";
return ;
}
结果如下:
可以看到,在用reverse()翻转后就变成了降序,这里提醒一下,为了节省篇幅,让大家看起来更流畅,下面两个方法都将只使用一种数据类型了,以减少代码长度
2. 除了用reverse()翻转外,还可以借助c++标准库来实现降序(或升序)。此时要包含头文件<functional>,<functional>头文件提供了一些基于模板的比较函数对象,
这里在排序的时候只用到了 greater<type>() 和 less<type>() 两个;让 greater<type>() 或 less<type>() 做sort()函数的第三个参数来实现升序或降序排列;其中
greater<type>() 用于降序排列,less<type>() 用于升序排列,具体用法看代码
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
int a[]={,,,,,,,,,}; cout<<"对a排序前:";
for(int i=;i<;i++)
cout<<a[i]<<" "; cout<<"\n对a降序排列后:";
sort(a,a+,greater<int>());
for(int i=;i<;i++)
cout<<a[i]<<" "; cout<<"\n对a升序排列后:";
sort(a,a+,less<int>());
for(int i=;i<;i++)
cout<<a[i]<<" ";
cout<<"\n";
return ;
}
结果如下图:
3. 第三个方法是自己写一个比较函数来实现升序或降序排列,并让这个比较函数做sort()函数的第三个参数;其实比较函数不仅能实现升序降序排列,还能实现其他的功能。
这就是sort()函数功能强大的地方,它可以扩展,而扩展的关键就是第三个参数,所以我把这种方法放在最后讲。
先说一下比较函数吧,当你想实现特定比较方式的时候,就要自己定义一个返回bool值的比较函数了;这时sort()函数的第三个参数就是一个函数,如果它返回假值就交换
操作对象的位置,返回真值的话操作对象位置不变。下面就用比较函数来实现升序降序的排列,看代码
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
bool cmp1(int a,int b) //按降序排列
{
return a>b;
} bool cmp2(int a,int b) //按升序排列
{
return a<b;
}
int main()
{
int a[]={,,,,,,,,,}; cout<<"对a排序前:";
for(int i=;i<;i++)
cout<<a[i]<<" "; cout<<"\n对a降序排列后:";
sort(a,a+,cmp1); //这里不需要对比较函数cmp1传入参数
for(int i=;i<;i++)
cout<<a[i]<<" "; cout<<"\n对a升序排列后:";
sort(a,a+,cmp2); ////不需要对比较函数cmp2传入参数
for(int i=;i<;i++)
cout<<a[i]<<" ";
cout<<"\n";
return ;
}
结果看下图:
这里对比较函数的原理介绍一下: bool cmp(int a, int b);在定义这个比较函数的时候要明确比较对象的数据类型,这里是int型,也可以是其他的任意类型,比如结构体、vector、链表等。
但是在使用的时候(即做sort()函数的第三个参数时)不用对cmp传入参数,这是需要注意的地方。下面就是比较原理了
bool cmp(int a,int b)
{
return a>b;
}
sort(a,a+10,cmp);
sort() 操作的对象数组或vector中两个挨着的顺序元素分别赋值到a和b上,通过一系列操作(这个操作就是你写的比较函数要实现的功能)后,返回bool值。
上面的sort()函数都是对简单的数据类型进行排序,那之前也说过,sort()还可以对结构体、链表、vector等排序,不过还是要你自己去写比较函数的。这里就用结构体举例了,
下面通过一道题来体现比较函数的强大功能,这是之前我刷过的PTA的一道题。题目如下
其实这道题就要用到比较函数,用比较函数来实现sort()对结构体的排序,而且这里的比较函数要比之前写的比较函数cmp1和cmp2复杂点,并且比较对象都是结构体。
下面只贴出了封装的结构体和比较函数的代码
struct student{
int id,dscore,cscore;
int sum;//总分
};
bool cmp(student a,student b)
{ //按降序排列
if(a.sum!=b.sum)
return a.sum>b.sum; //优先按总分的高低排序
else if(a.dscore!=b.dscore)
return a.dscore>b.dscore; //总分相同则优先按德分排序
else
return a.id<b.id; //总分和德分都相同则按学号排序
}
本题我在 “PTA刷题” 随笔里面详细讲到了,里面有完整代码,想看的可以去看一下,附上链接:
本人还正在学习中,水平有限,如果哪里写的不当,还请指出,谢谢哈 !
<algorithm>中sort()函数的用法的更多相关文章
- #include <algorithm>中sort的一般用法
1.sort函数的时间复杂度为n*log2(n),执行效率较高. 2.sort函数的形式为sort(first,end,method)//其中第三个参数可选. 3.若为两个参数,则sort的排序默认是 ...
- C++ sort()函数的用法
C++sort()函数的用法 C++sort()函数的用法 近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧! (一)为什么要用c++标准库里的排 ...
- C/C++ sort函数的用法
sort函数的用法(#include<algorithm>) 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比 ...
- 结构体与C++sort()函数的用法
C++sort()函数的用法 先看道题(本题来自http://codeup.cn/第26099): 题目描述 [问题描述] 高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束 ...
- C++<algorithm>中sort的比较函数写法(转)
转自:http://www.wl566.com/biancheng/98907.html C++<algorithm>中sort的比较函数写法,有需要的朋友可以参考下. 定义排序函数: 方 ...
- matlab中patch函数的用法
http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...
- mysql中INSTR函数的用法
mysql中INSTR函数的用法 INSTR(字段名, 字符串) 这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) SELECT * FROM tblTo ...
- (转)解析PHP中ob_start()函数的用法
本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下 ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行 ...
- STL之sort函数的用法
说明:本文仅供学习交流,转载请标明出处,欢迎转载! STL封装了一个排序算法,该算法相应的头文件为#include<algorithm>,我们能够依据须要对一个数组进行排序或者降序. so ...
随机推荐
- 左手C#,右手Java
C# takes me to develop career, Java makes me more powerful. Code is poetry.
- 透过 ReentrantLock 分析 AQS 的实现原理
对于 Java 开发者来说,都会碰到多线程访问公共资源的情况,这时候,往往都是通过加锁来保证访问资源结果的正确性.在 java 中通常采用下面两种方式来解决加锁得问题: synchronized 关键 ...
- 深入解读ES6系列(一)
ECMAScript 6(ES6)简介 前言: 哈喽小伙伴们,爱说'废'话的Z又回来了,欢迎来到Super IT曾的博客时间,我说啦这个月要带的福利,说了更的博客肯定不能水你们,要一起进步学习嘛,今天 ...
- Python 程序慢的像蜗牛,我该怎么办?
1. “一猿小讲”的风格就是多元化,偶尔会真情吐露一下程序猿的内心:偶尔也结合自己的经历畅聊一些经验杂谈:其中也不乏幽默风趣的技术故事.分享是件快乐的事情,工作之余,有时间我就尽力多码字,多推几篇文章 ...
- STM32F103ZET6系统定时器SysTick
1.系统定时器SysTick的简介 系统定时器SysTick属于内核外设,内嵌在NVIC中.SysTick是一个24位的向下递减的计数器,计数器根据SysTick的时钟源计数,当SysTick的计数器 ...
- H5的新特性
https://blog.csdn.net/weixin_42441117/article/details/80705203 1.h5新语义元素(有利于代码可读性和SEO)2.本地存储 h5提供 ...
- js实现 多级联动
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- python开发基于SMTP协议的邮件代发服务
写在这篇文章前照例给大家灌输点名词解释,理论知识,当然已经很熟悉的同学可以往下翻直接看干货 1. 什么是SMTP SMTP即简单传输协议(Simple Mail Transfer Protocol), ...
- 打开scratch后蓝屏怎么办
1.试试开机,百出完电脑品牌后,按F8,安全模式,光标选定:最后一次正确配置,回车,回车,按下去,[度关键一步]2.再不行,问进安全模式,回车,到桌面后,用杀毒软件腾讯电脑管家,全盘杀毒,“隔离区”的 ...
- java第十九天,Collections集合工具类的使用
Collections Java中集合都实现了Collection接口,那么针对集合一些特定的功能,有没有一个接口或类能够统一的集成一些集合必要的功能呢?当然能.它就是--Collections集合工 ...