<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 ...
随机推荐
- iOS UmbrellaFramework
一.umbrella framework 将几个已经封装好的 framework 封装成一个,封装的这种 framework 就是 umbrella framework. Apple 的官方文档中明确 ...
- Ubuntu环境下如何设置文件(文件夹)权限
查看文件(文件夹)权限 cd到需要查看的文件(文件夹)所在目录并执行: (base) duanyongchun@hc1217:~$ ls -l #查看当前文件夹下的所有文件(包括文件夹)的权限 如图: ...
- std::bind接口与实现
前言 最近想起半年前鸽下来的Haskell,重温了一下忘得精光的语法,读了几个示例程序,挺带感的,于是函数式编程的草就种得更深了.又去Google了一下C++与FP,找到了一份近乎完美的讲义,然后被带 ...
- js中写laravel模板blade语法和PHP逻辑解决方法
在js中是否能够执行blade的语法?或者说在js中能否处理PHP逻辑呢? 答案是,当然的 下面来看需求:在提交表单,完成入库操作后,使用 return redirect(route('admin.u ...
- canvas 实现手机图案解锁
参考☞: https://www.cnblogs.com/chenyingying0/ 先上效果图: 我是在 vue 里面实现js 文件 ,所以如果需要在vue 里面使用 可以将以下内容import ...
- Oracle给权限和同义词
在同一个DB下,用户A创建了一个Table(student),用户B无法访问.如果B想要访问,就需要A赋予B权限. 登录用户A执行下面语句: GRANT SELECT, INSERT, UPDATE, ...
- Centos网络的配置
...
- 微信小程序mpvue-动态改变navigationBarTitleText值
通过JS动态 改变navigationBarTitleText的值 能否通过JS动态改变navigationBarTitleText的值? 方法一:可以在onLoad方法中通过wx.setNaviga ...
- matplotlib PyQt5 nivigationBar 中pan和zoom功能的探索
为matplotlib生成的图添加编辑条,我们导入NavigationToolbar2QT from matplotlib.backends.backend_qt5agg import Navigat ...
- JS获取链接中的参数
/*获取当前页面链接中的参数*/ function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + ...