STL之sort应用

简介: STL之sort应用

前言


顾名思义,sort()是标准库中的排序算法,能用此算法的容器是支持随机访问的容器:vector, deque, string,array。

其有两种形式,第一种sort(a,b),其中a,b为排序的地址范围,为[a,b),此时用operator<作比较,默认升序排序。

第二种sort(a,b,comp),此时采用comp进行比较,comp带两个同类型的参数,如果第一个参数排在第二个参数前面,返回true,否则返回false,它可以是函数指针,也可以是函数对象,即仿函数。

下为几个常见的仿函数:

less(小于)

greater(大于)

equal_to(等于)

not_equal_to(不相等)

less_equal(小于等于)

greater_equal(大于等于)

须注意不能直接写入仿函数的名字,而是要写其重载的()函数:

less<>()

greater<>()


常见sort分类


1.全排序


sort 和 stable_sort,前者不稳定,采用快排,后者为稳定排序,归并排序


2.部分排序


partial_sort,如part_sort(a,a+n,comp);只排前n个,采用堆排序,显然适用于求解topn问题。


结构体排序


针对两种sort的两种形式主要有两种应用形式。


1.运算符重载


采用sort(a,b),或者只想利用上述常见的伪函数,需要用到运算符重载。

#include<iostream>
#include<algorithm> 
#include<string>
using namespace std;
struct student{
  string name;
  int age;
  bool operator<(const student &a)const{//运算符重载 
  if(name==a.name)return age<a.age;
  return name<a.name; 
  }
};
int main(){
  student s[3] ;
  s[0].name="Kndy";s[0].age=12;
  s[1].name="Anm";s[1].age=17;
  s[2].name="Kndy";s[2].age=11;
  sort(s,s+3);
  for(int i=0;i<3;i++)
  cout<<s[i].name<<"  "<<s[i].age<<endl;
  return 0;
}


输出结果:

1685008737177.jpg

若上述重载是对>重载,排序改为:sort(s,s+3,greater<student>());,降序排序,结果为:

1685008744490.jpg


2.比较函数


此时需自己定义一个比较函数,如果第一个参数排在第二个参数前面,返回true,否则返回false。

#include<iostream>
#include<algorithm> 
#include<string>
using namespace std;
struct student{
  string name;
  int age;
};
bool comp(const student &a,const student &b){
  if(a.name==b.name)return a.age<b.age;
  return a.name<b.name;
}
int main(){
  student s[3] ;
  s[0].name="Kndy";s[0].age=12;
  s[1].name="Anm";s[1].age=17;
  s[2].name="Kndy";s[2].age=11;
  sort(s,s+3,comp);
  for(int i=0;i<3;i++)
  cout<<s[i].name<<"  "<<s[i].age<<endl;
  return 0;
}


显然此时应该是升序排序结果如下:

1685008577635.jpg

相关文章
|
机器学习/深度学习 Linux Python
服务器上后台运行python程序
服务器上后台运行python程序
1187 0
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
258 5
|
11月前
|
监控 前端开发 测试技术
如何使用 Tree Shaking 进行代码优化
Tree Shaking 是一种通过去除未使用的代码来优化项目打包体积的技术,在现代前端开发中被广泛应用
|
小程序 数据库
【微信小程序-原生开发】实用教程10 - 动态的新增、修改、删除(含微信云数据库的新增、修改、删除,表单弹窗、确认弹窗、日期选择器、单行输入框、多行输入框、滑动组件的使用)
【微信小程序-原生开发】实用教程10 - 动态的新增、修改、删除(含微信云数据库的新增、修改、删除,表单弹窗、确认弹窗、日期选择器、单行输入框、多行输入框、滑动组件的使用)
601 0
|
10月前
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
3027 8
|
12月前
|
Ubuntu 网络安全 数据库
使用官方开源项目搭建自有Overleaf服务
【10月更文挑战第6天】本文详细介绍了在服务器上部署 Overleaf 服务的步骤,包括服务器环境准备、域名与 SSL 证书配置、获取官方项目代码、配置与构建服务,以及测试和使用服务等内容。适用于希望自建 Overleaf 服务的用户。建议服务器配置为 Ubuntu 系统,具备至少 10GB 磁盘和 2GB 内存。
770 0
|
Linux 应用服务中间件 nginx
Linux 快速搭建 Overleaf 5.0 附中文字体及完整 TexLive 安装教程(2024最新版)
2024最新版 Linux 极速安装 Overleaf 5.0 手把手教学!附 XeLatex 修复,新增中文字体以及安装完整版 TexLive 教程!
|
数据可视化 Java API
如何在项目中快速引入Logback日志并搭配ELK使用
如何在项目中快速引入Logback日志并搭配ELK使用
|
人工智能 机器人
【好玩AI】【Prompt】情人节了,用GPT写个【骂醒恋爱脑】的机器人跟自己对话吧
【好玩AI】【Prompt】情人节了,用GPT写个【骂醒恋爱脑】的机器人跟自己对话吧
584 0