C++关于sort和priority_queue的运算符重载
C++中的sort函数默认是将元素升序排列的,而priority_queue默认是将元素降序排列的(默认实现的是大顶堆)。
自定义运算符用的比较多,以下2种对sort和priority_queue运算符的重载都有效,效果都是一样的:
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std; //sort实现的都是先按a值降序排列,a相同时,按b值降序排列
//priority_queue和sort的默认排序相反,实现的都是先按a值升序排列,a相同时,按b值升序排列 //重载方式一:
struct Node {
int a, b;
Node(int x, int y) {
a = x;
b = y;
}
bool operator < (const Node &c) const {
if(a == c.a) return b > c.b;
return a > c.a;
}
}; //重载方式二:注意要有public
// class Node {
// public:
// int a, b;
// Node(int x, int y) {
// a = x;
// b = y;
// }
// bool operator < (const Node &c) const {
// if(a == c.a) return b > c.b;
// return a > c.a;
// }
// };
int main() {
vector<Node> v;
v.push_back(Node(,));
v.push_back(Node(,));
v.push_back(Node(,));
v.push_back(Node(,));
sort(v.begin(), v.end());
for(int i = ; i < v.size(); ++i) {
cout<<v[i].a<<" "<<v[i].b<<endl;
}
cout<<endl; priority_queue<Node> pq;
pq.push(Node(,));
pq.push(Node(,));
pq.push(Node(,));
pq.push(Node(,));
while(!pq.empty()) {
cout<<pq.top().a<<" "<<pq.top().b<<endl;
pq.pop();
}
return ;
}
输出
对sort单独自定义运算符:
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std; //sort实现的都是先按a值降序排列,a相同时,按b值降序排列
//priority_queue和sort的默认排序相反,实现的都是先按a值升序排列,a相同时,按b值升序排列 struct Node {
int a, b;
Node(int x, int y) {
a = x;
b = y;
}
};
/*
//重载方式一:
struct compare {
bool operator()(const Node a, const Node b) {
if(a.a == b.a) return a.b > b.b;
return a.a > b.a;
}
} cmp;
*/ /*
//重载方式二:
bool cmp(const Node a, const Node b) {
if(a.a == b.a) return a.b > b.b;
return a.a > b.a;
}
*/ int main() { vector<Node> v;
v.push_back(Node(,));
v.push_back(Node(,));
v.push_back(Node(,));
v.push_back(Node(,));
//重载方式一和二:
sort(v.begin(), v.end(), cmp);
//重载方式三:
sort(v.begin(), v.end(), [](const Node a, const Node b) {
if(a.a == b.a) return a.b > b.b;
return a.a > b.a;
});
for(int i = ; i < v.size(); ++i) {
cout<<v[i].a<<" "<<v[i].b<<endl;
}
cout<<endl;
return ;
}
输出都是
对priority_queue单独自定义运算符:
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std; //sort实现的都是先按a值降序排列,a相同时,按b值降序排列
//priority_queue和sort的默认排序相反,实现的都是先按a值升序排列,a相同时,按b值升序排列 struct Node {
int a, b;
Node(int x, int y) {
a = x;
b = y;
}
}; struct cmp {
bool operator()(const Node a, const Node b) {
if(a.a == b.a) return a.b > b.b;
return a.a > b.a;
}
}; int main() {
priority_queue<Node, vector<Node>, cmp> pq; pq.push(Node(,));
pq.push(Node(,));
pq.push(Node(,));
pq.push(Node(,));
while(!pq.empty()) {
cout<<pq.top().a<<" "<<pq.top().b<<endl;
pq.pop();
} return ;
}
效果:
C++关于sort和priority_queue的运算符重载的更多相关文章
- priority_queue的运算符重载问题
对于需要比较的函数或STL(最常见的为sort,priority_queue) 要对自创的结构进行运算符重载(sort可以写cmp,一样的效果) 1.只能对小于号重载 cmp函数与其起到相同的作用 2 ...
- set/priority_queue的运算符重载
#include<bits/stdc++.h> using namespace std; struct cmp { bool operator ()(int a, int b) //重载小 ...
- 运算符重载 与 sort()
运算符重载与sort() 二话不说上代码: #include <iostream> #include <algorithm> using namespace std; stru ...
- C++运算符重载的妙用
运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,o ...
- 深入C++05:运算符重载
运算符重载 1.复数类 运算符重载目的:使对象运算表现得和编译器内置类型一样: 复数类例子 #include<iostream> using namespace std; class CC ...
- C++ 运算符重载时,将运算符两边对象交换问题.
在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++运算符重载
C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...
- 标准C++之运算符重载和虚表指针
1 -> *运算符重载 //autoptr.cpp #include<iostream> #include<string> using namespace std ...
随机推荐
- Android Studio-引用jar及so文件
一.引用jar文件 1.将jar文件复制.粘贴到app的libs目录中: 2.右键点击jar文件,并点击弹出菜单中的“Add As Library”,将jar文件作为类库添加到项目中: ...
- Java学习--数组与方法
1. public class MethodDemo01{ public static void main(String args[]){ printInfo() ; // 调用printInfo() ...
- I2S接口工作原理
I2S音频通信协议 I2S有3个主要信号: 1.串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲.SCLK的频率=2×采样频率×采样位数 2. 帧时钟LRC ...
- 微擎开启redis memcache
微擎开启redis memcache 2018年01月20日 14:39:54 luogan129 阅读数:2161更多 个人分类: 微信开发 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- SQL关闭自增长列标识:SET IDENTITY_INSERT
关闭自增长列添加记录,然后再恢复自增长功能 SET IDENTITY_INSERT 表名 ON; inert ,); SET IDENTITY_INSERT 表名 OFF
- MVVM双向绑定实现之Object.defineProperty
随着web应用的发展,直接操作dom的应用已渐行渐远,取而代之的是时下越来越流行的MVVM框架,dom操作几乎绝迹,这里面自然是框架底层封装的结果.MVVM框架的双向数据绑定使开发效率大大提高:然后在 ...
- 100道Java基础面试题
1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Client/Server),客户端/服务端,桌面应用程序 2.你所知道网络协议有那些? H ...
- API网关【gateway 】- 2
最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析. 由于采用了大量的nginx相关的东西,所以在此记录一下: 配置连 ...
- 【文文殿下】NOIp2018游记
Day-1 本段更新于 2018年11月8日23:26:44 今天还在机房里面,无所事事吧.上午睡了一上午,出去理了一下发,花了20块钱 QAQ. 下午来到机房,复习了一下exgcd的东西. 发现自己 ...
- Ms17-010进行WEB提权之实践下某培训靶机服务器
前言:该机器为某个其他培训机构的靶机,说实话在这里没炫耀啥,只是给各位学习Ms17010的同学指一条路,我原先也折腾这玩意儿好久,但是就是不行,最近才找到了出路,所以多写两篇文章,把各种需要注意的地方 ...