先说一下,本篇文章我没有讲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()函数的用法的更多相关文章

  1. #include <algorithm>中sort的一般用法

    1.sort函数的时间复杂度为n*log2(n),执行效率较高. 2.sort函数的形式为sort(first,end,method)//其中第三个参数可选. 3.若为两个参数,则sort的排序默认是 ...

  2. C++ sort()函数的用法

    C++sort()函数的用法 C++sort()函数的用法 近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧! (一)为什么要用c++标准库里的排 ...

  3. C/C++ sort函数的用法

    sort函数的用法(#include<algorithm>) 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比 ...

  4. 结构体与C++sort()函数的用法

    C++sort()函数的用法 先看道题(本题来自http://codeup.cn/第26099): 题目描述 [问题描述] 高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束 ...

  5. C++<algorithm>中sort的比较函数写法(转)

    转自:http://www.wl566.com/biancheng/98907.html C++<algorithm>中sort的比较函数写法,有需要的朋友可以参考下. 定义排序函数: 方 ...

  6. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  7. mysql中INSTR函数的用法

    mysql中INSTR函数的用法 INSTR(字段名, 字符串) 这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) SELECT * FROM tblTo ...

  8. (转)解析PHP中ob_start()函数的用法

    本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下     ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行 ...

  9. STL之sort函数的用法

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! STL封装了一个排序算法,该算法相应的头文件为#include<algorithm>,我们能够依据须要对一个数组进行排序或者降序. so ...

随机推荐

  1. CUDA编程入门

    CUDA是一个并行计算框架.用于计算加速.是nvidia家的产品.广泛地应用于现在的深度学习加速. 一句话描述就是:cuda帮助我们把运算从cpu放到gpu上做,gpu多线程同时处理运算,达到加速效果 ...

  2. ES6中async与await的使用方法

    promise的使用方法 promise简介 是异步编程的一种解决方案.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.解决回调函数嵌套过多的情况 const promise =n ...

  3. MySQL出现的问题

    错误展示 今天还是老样子照常启动MySQL WorkBench的时候出了错误,无法连接服务器 CMD登陆也不行 发现mysql的服务都没启动,于是点击启动,却又报这个错 cmd查看MySQL的日志,想 ...

  4. Three中的动画实现-[three.js]

    Table Of Content 动画原理 js中动画实现原理setInterval js中动画实现新方法requestAnimationFrame 一个示例 动画原理 动画的本质实际上就是快速地不断 ...

  5. jmeter发送Query String Parameters格式参数报错

    当发起一次GET请求时,参数会以url string的形式进行传递.即?后的字符串则为其请求参数,并以&作为分隔符 当参数为json格式时,这时需要勾选编码,否则会报错

  6. Android | 教你如何开发扫二维码功能

    前言   最近要做一个停车场扫码收费的app,在网上搜了一圈,首先接触到了ZXing,上手试了下,集成过程不复杂,但是感觉效果欠佳,比如距离稍微远点儿就扫不出来了,另外角度对的不好,反光或者光线比较暗 ...

  7. Vulnhub JIS-CTF-VulnUpload靶机渗透

    配置问题解决 参考我的这篇文章https://www.cnblogs.com/A1oe/p/12571032.html更改网卡配置文件进行解决. 信息搜集 找到靶机 nmap -sP 192.168. ...

  8. kepp running 团队视频分析初步总结

    一.遇码则码队视频讨论: 时    间:2020.03.31 方    式:视频会议 参加人员:温学智,胡海靖,莫佳亮 二.视频讨论会议截图: 三.纪要内容: (1).主要功能和界面显示: 温学智:在 ...

  9. Loop Unrolling 循环展开

    在csapp第五章5.2中提到了循环展开(loop unrolling).这里展开一下为什么循环展开可以提升程序的效率. 以书中计算数组和的两段代码为例: 1.未展开: void psum1(floa ...

  10. mysql 不能对同一个表进行 update(delete) 和 select 联合操作

    eq:     update a set  a.x = 1  where a.y  in (select a.x from  a); 上边语法是错误的,在对aupdate 时不能再条件中对同一个a表进 ...