<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程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回 ...
- [leetcode] 树 -Ⅰ
均为 Simple 难度的水题. 二叉树的中序遍历 题目[94]:给定一个二叉树,返回它的中序 遍历. 解题思路:Too simple. class Solution { public: vector ...
- Java 异常处理与输入输出
一.异常 1.1 package exception; import java.util.Scanner; public class ArrayIndex { public static void m ...
- XDebug的配置和使用
简介 XDebug是一个开放源代码的PHP程序调试器(即一个Debug工具) 可以用来跟踪,调试和分析PHP程序的运行状况 功能强大的神器,对审计有非常大的帮助. 官网:http://www.xdeb ...
- JS 剑指Offer(五) 二叉树的重建
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目分析:已知二叉树的前序和中序遍历,根据前序遍历和中序遍历的规则,前序遍历的第一 ...
- Sql练习201908200918
表结构: 昨天遇到一个笔试题,求一个聚合函数小于等于1000的值,并将编号同时输出. sql server: select nid,SUM(amount) amountSum from orders_ ...
- Jmeter 压力测试笔记(1)--服务器迁移失败
近期,公司服务器因技术架构升级等原因需要迁移,在经过开发,运维DBA,测试多部门进行联合讨论后,制定出了迁移方案.迁移前也对APP应用进行了各种测试,并没有发现问题. 凌晨2点开始迁移,5点完成迁移. ...
- 如何在 Array.forEach 中正确使用 Async
本文译自How to use async functions with Array.forEach in Javascript - Tamás Sallai. 0. 如何异步遍历元素 在第一篇文章中, ...
- GlusterFS 4.1 版本选择和部署
GlusterFS 4.1 版本选择和部署 目录 GlusterFS 4.1 版本选择和部署 1 前言相关 1.1 glusterfs优势 1.2 版本选择 1.3 volume知识 2 服务部署 2 ...
- Linux服务器架设篇,Nginx服务器的架设
1.安装 nginx依赖包 (1)安装pcre yum install pcre-devel (2)安装openssl yum -y install openssl-devel (3)安装zlib y ...