C++ STL自定义排序

更具体的看【速记】C++ STL自定义排序 - 知乎 (zhihu.com)

sort

sort第三个位置放的greater<int>和less<int>萌新可能会弄错,这两个单词不是更大和更小的意思,而是大于和小于,并且比较就是自定义排序中的前者后者。

如果是less,就代表 前者小于后者,那么自然是升序。

    vector<int>a;a.push_back(3);a.push_back(2);sort(a.begin(),a.end(),less<int>());for(auto i:a)cout<<i<<" ";

同理的,greater的意思就是 前者大于后者 自然就是降序,代码就不再展示了。

默认写法,就是使用less和greater,但是有时候默认排序可能不满足我们的要求,就要自定义了,下面记录一下都可以的。

1、使用cmp函数,cmp里面的a,b含义就是容器的前者和后者,因此这么写也是升序。

bool cmp(int a,int b){return a<b;
}void solve(){vector<int>a;a.push_back(3);a.push_back(2);sort(a.begin(),a.end(),cmp);for(auto i:a)cout<<i<<" ";
}

当然你想容器里面套更多的元素也是可以的。

bool cmp(array<int,2> a,array<int,2> b){return a[0]>b[0];
}void solve(){vector<array<int,2>>a;a.push_back({1,2});a.push_back({2,3});sort(a.begin(),a.end(),cmp);for(auto i:a)cout<<i[0]<<" "<<i[1]<<endl;
}

2、写法Lambda函数,本质上还是在用函数,不过把函数写成Lambda形式了。

    vector<int>a;a.push_back(3);a.push_back(2);auto cmp=[&](int a,int b){return a<b;};sort(a.begin(),a.end(),cmp);for(auto i:a)cout<<i<<" ";

或者使用Lambda形式的匿名表达式

    vector<int>a;a.push_back(3);a.push_back(2);sort(a.begin(),a.end(),[](int a,int b){return a<b;});for(auto i:a)cout<<i<<" ";

tip:改成int &a,int &b,不会更快,因为sort函数不会产生新数组,是在原有的数组上排序,观察sort可以发现,第一个是 首地址,第二个是 结束地址。

当然也可以使用function来封装函数。

    vector<int>a;a.push_back(3);a.push_back(2);function<bool(int a,int b)>cmp=[&](int a,int b){return a<b;};sort(a.begin(),a.end(),cmp);for(auto i:a)cout<<i<<" ";

3、重载运算符(个人感觉写个cmp函数更方便)

struct Node{int val;bool operator < (const Node &b){return val>b.val;}
}a[3];void solve(){a[1].val=2;a[2].val=3;sort(a+1,a+2+1);cout<<a[1].val<<" "<<a[2].val;
}

因为默认是 less 排序,即升序,所以我们要重载小于号。

比如这里改成 前者大于后者(这里val就是前者,右边的那个常量就是后者)

输出就是

会自动排序的容器

类似set,map这种容器,我们就不能用sort了,要提前定好一个排序类,重载内部的排序。

比较方式不变,依旧是前者和后者的比较。

tip:优先队列排序,输出最后面的(如less升序,就输出最大值。greater降序,就输出最小值),如果要 重载优先队列,这一点要多注意。

理论上map和set只有 key是自动排序的,value不会,所以不建议对value自定义排序。

比如下面要对map重载成自动降序。

struct MyMap{bool operator() (const int &a,const int &b)const{return a>b;}
};map<int,int,MyMap>f;void solve(){f[1]=2;f[2]=1;for(auto i:f)cout<<i.fr<<" ";
}

显然这是没必要的。

因为map可以逆序遍历。

正序是 begin()->end()

逆序就是 rbegin()->rend()

r就是单词reverse(反向、逆向都行)的缩写。

重载自动排序的类,里面格式都是固定的,比如 bool operator() (const &,consg &)const{}

下面再放一个对自定义类自动排序的。

struct Node{int a,b;
};struct MyMap{bool operator() (const Node &A,const Node &B)const{return A.a<B.a;}
};map<Node,bool,MyMap>f;void solve(){f[{2,1}]=1;f[{1,2}]=1;for(auto i:f){cout<<i.fr.a<<" "<<i.fr.b<<endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用DS file+cpolar内网穿透实现远程访问本地群晖NAS传输文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用程序具有…

C++语言入门

1.Hello&#xff0c;World&#xff01; #include <iostream> //使用cout&#xff0c;可调用iostream库 using namespace std; int main() {cout << "Hello,Wordl!" << endl; //输出 Hello World&#xff01;return 0; //结束整个程序 } #in…

【BUG】Windows状态栏总卡死解决办法

屋漏偏逢连夜雨&#xff0c;正在赶deadline呢&#xff0c;Windows状态老卡死&#xff0c;一时间崩溃。 解决办法&#xff1a; 右键状态栏新闻和咨询关掉 这个烧笔新闻与资讯我真服了

java算法第十五天 | ● 层序遍历 ● 226.翻转二叉树 ● 101.对称二叉树

层序遍历 思路&#xff1a; 需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是图论中的广度优先遍历&#xff0c;只不过我们应用在…

在nginx 服务器部署vue项目

以人人快速开发的开源项目&#xff1a;renren-fast-vue 为例 注&#xff1a;这里开始认为各位都会使用nginx 打包vue项目 npm run build 测试打包的项目是否可以运行 serve dist 可以正常运行 编译报错请移步到&#xff1a;renren-fast-vue1.2.2 项目编译报错: build g…

2024三掌柜赠书活动第十三期:API安全技术与实战

目录 前言 API安全威胁与漏洞 API安全技术与实践 API安全实战案例 关于《API安全技术与实战》 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《API安全技术与实战》全书速览 结束语 前言 随着互联网的快速发展和应用程序的广泛使用&#xff0c;API&#xff…

docker中的具名和匿名挂载

1. 匿名挂载 -v 容器内路径 [rootwq ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx b250dffbd5f0d1cb0e4717dab6bf5212ae378869099aa1a6ece08a25519554a7查看所有的volume的情况 [rootwq ~]# docker volume ls DRIVER VOLUME NAME local 2bc73b32eed4d0…

贪心刷题3-合并果子

题目来源&#xff1a;[NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 参考书目&#xff1a;《深入浅出程序设计竞赛&#xff08;基础篇&#xff09;》 解题思路&#xff1a;这道题的关键在于每次选择合并时都要选择最小的两堆果子来合并&#xff0c;从而保…

MySQL 元数据锁及问题排查(Metadata Locks MDL)

"元数据"是用来描述数据对象定义的&#xff0c;而元数据锁&#xff08;Metadata Lock MDL&#xff09;即是加在这些定义上。通常我们认为非锁定一致性读&#xff08;简单select&#xff09;是不加锁的&#xff0c;这个是基于表内数据层面&#xff0c;其依然会对表的元…

python中的类

_init_()函数 所有类都有一个名为__init__()的函数&#xff0c;它在每次使用类创建新对象时都会自动执行&#xff0c;可用于将用户指定的值在初始就赋给对象的属性&#xff0c;或者在创建对象时执行一些固定操作&#xff0c;如下&#xff1a; class Person:def __init__(self…

Python之Web开发初学者教程—ubuntu下vi的使用

Python之Web开发初学者教程—ubuntu下vi的使用 vi\vim 文本编辑器 i 切换到输入模式&#xff0c;以输入字符。 x 删除当前光标所在处的字符。 : 切换到底线命令模式&#xff0c;以在最底一行输入命令。 vi 保存并退出&#xff1a;esc键退出编辑-…

网络学习:Vlan原理

目录 一、交换机对数据帧的处理 1、Access&#xff1a; 2、Trunk&#xff1a; 3、Hybrid&#xff1a; 二、VLAN的划分方式 三、VLAN信息的传播技术&#xff08;MVRP协议&#xff09; 1、VLAN动态注册背景&#xff1a; 2、MVRP技术&#xff1a; 3、MVRP注意点&#xff…

前缀和与差分——练习(一维+二维)

一、前言 前缀和与差分算是很常用的算法&#xff0c;熟记是有必要的。 ——题目来源y总每日一题&#xff0c;感觉正适合模板分块讲解系列。 二、浅谈 我们可以用a数组作为前缀和数组&#xff0c;b数组作为差分数组&#xff0c;因为二者互为逆运算。 他们常常用做优化&#xff…

Python爬虫——Selenium

简介 Selenium是一个自动化测试框架&#xff0c;可以通过编程语言控制浏览器进行各种操作。在Python中&#xff0c;可以使用Selenium实现爬虫。 首先&#xff0c;我们需要需要安装Selenium库。可以使用pip命令安装&#xff1a; pip install selenium要使用的话我们还需…

7-Zip:一款免费开源但强大的压缩软件

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是7-zip?①为什么选择7-Zip?②7-Zip的主要特点二、下载安装三、如何使用7-Zip?四、总结很高兴你打开了这篇博客,如有疑问,欢迎评论…

密码学之椭圆曲线

引言 DH(Diffie-Hellman)密钥交换算法于1976年提出,是第一个公开密钥交换算法。其基础是数学中的群论,群论也是大多数公开密钥密码的基础。简单来说,群是一组元素的集合以及在这些元素上定义的特殊二元运算。 一个群需要满足如下性质: 封闭性:群中两个元素的运算结果仍…

用于生成环境噪声的Noisedash

本文中关于音频的专业描述&#xff0c;来自于互联网和 ChatGPT&#xff1b; 什么是白噪声 &#xff1f; 白噪声&#xff08;White Noise&#xff09;是具有平均功率的随机信号&#xff0c;其功率在整个频谱范围内均匀分布。它的能量在所有频率上都是相等的&#xff0c;没有频率…

【Linux C | 网络编程】广播概念、UDP实现广播的C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

代码随想录算法训练营第33天—动态规划01 | ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

动态规划理论基础 https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 视频&#xff1a;https://www.bilibili.com/video/BV13Q4y197Wg 主要题型 动规基础题 斐波那契数列 背包问题打家劫舍股票问题子序列问题 解题…

伟大音乐家的伟大不朽作品,贝多芬一生的音乐作品全集

一、音乐描述 贝多芬一生创作题材广泛&#xff0c;重要作品包括9部交响曲、1部歌剧、32首钢琴奏鸣曲、5首钢琴协奏曲、多首管弦乐序曲及小提琴、大提琴奏鸣曲等。因为其对古典音乐的重大贡献&#xff0c;以及对奏鸣曲式和交响曲套曲结构的发展和创新&#xff0c;而被后世尊称为…