<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 ...
随机推荐
- Java 学习笔记 第一章:Java语言开发环境搭建
第一章:Java语言开发环境搭建 第二章:常量.变量和数据类型 第三章:数据类型转换.运算符和方法入门 1.Java虚拟机——JVM JVM(Java Virtual Machine ):Java虚拟 ...
- LeetCode#1047-Remove All Adjacent Duplicates In String-删除字符串中的所有相邻重复项
一.题目 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们. 在 S 上反复执行重复项删除操作,直到无法继续删除. 在完成所有重复项删除操作后返回最终的字符串.答案 ...
- Oracle如何查询不等于某数值
前言 今天在使用Oracle查询“不等于”的时候,发现得到的数据与期望中的不一样,进一步查找资料才有发现. 1.Oracle的不等于 在Oracle中,"<>".&qu ...
- MetaQNN : 与Google同场竞技,MIT提出基于Q-Learning的神经网络搜索 | ICLR 2017
论文提出MetaQNN,基于Q-Learning的神经网络架构搜索,将优化视觉缩小到单层上,相对于Google Brain的NAS方法着眼与整个网络进行优化,虽然准确率差了2-3%,但搜索过程要简单地 ...
- js 实现浏览器全屏效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- GlusterFS 4.1 版本选择和部署
GlusterFS 4.1 版本选择和部署 目录 GlusterFS 4.1 版本选择和部署 1 前言相关 1.1 glusterfs优势 1.2 版本选择 1.3 volume知识 2 服务部署 2 ...
- 初始WebApi(1)
如果你要问我WebApi是干嘛,我只能说它是的给数据.哈哈哈哈哈,这几天也才刚刚了解了解关于WebApi的知识,今天就来谈谈吧. 1.创建WebApi项目 第一步:选择ASP.NET Web应用程序 ...
- 【图机器学习】cs224w Lecture 7 - 节点的表示
目录 Node Embedding Random Walk node2vec TransE Embedding Entire Graph Anonymous Walk Reference 转自本人:h ...
- CentOS7安装JAVA环境
安装JAVA环境我常用的有两种形式 1.下载tar包安装 2.下载rpm包直接安装 本篇内容就写这两种形式的安装方法: JAVA程序的下载地址:https://www.oracle.com/java/ ...
- 选择IT行业的自我心得,希望能帮助到各位!(六)
在这个社会,想做大事的人很多,但是很多事情也挺难做的,为什么说复杂的事情简单做,简单的事情重复做,这样一个人才能获得更多的优越品质,为啥说改变,人还是挺难过的,都知道本性难移,想改挺难得.在这个社会千 ...