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的运算符重载的更多相关文章

  1. priority_queue的运算符重载问题

    对于需要比较的函数或STL(最常见的为sort,priority_queue) 要对自创的结构进行运算符重载(sort可以写cmp,一样的效果) 1.只能对小于号重载 cmp函数与其起到相同的作用 2 ...

  2. set/priority_queue的运算符重载

    #include<bits/stdc++.h> using namespace std; struct cmp { bool operator ()(int a, int b) //重载小 ...

  3. 运算符重载 与 sort()

    运算符重载与sort() 二话不说上代码: #include <iostream> #include <algorithm> using namespace std; stru ...

  4. C++运算符重载的妙用

    运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,o ...

  5. 深入C++05:运算符重载

    运算符重载 1.复数类 运算符重载目的:使对象运算表现得和编译器内置类型一样: 复数类例子 #include<iostream> using namespace std; class CC ...

  6. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  7. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  8. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  9. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

随机推荐

  1. Alpha阶段敏捷冲刺(四)

    1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:实现了统计的基本按钮和界面. 徐璐琳:找到&q ...

  2. 压力测试 mac ab

    apache ab:http://blog.chinaunix.net/uid-20382003-id-3032167.html 简单用法: ab -n 3000 -c 3000 http://www ...

  3. 用 select 语句实现递归的方法

    with Test_Recursion(Id,ParentId)AS(select Id,ParentId  from [V_KPI_DetailsActivities] where ParentId ...

  4. 实验1 单片机IO口应用及数码管显示

    1.   单片机驱动蜂鸣器的实验: a)         说明:Lab51单片机实验板的蜂鸣器连接到单片机的P1.5 b)        基本要求:控制蜂鸣器每2秒响0.5秒. #include &l ...

  5. 使用c# 实现冒泡排序

    冒泡排序是一个经典的案例 实现原理就数与数前后两两比较,如果前面比后面大则交换位置.最终达到从小到大的顺序,这样的排序方式就是冒泡排序. //冒泡排序 ;//定义一个中间变量,用来交换值 , , , ...

  6. 使用EF6连接mariaDB出现中文查找不到数据的问题

    1.问题描述 这两天使用ef6.0查询mariaDB出现了数据查询不到的情况 2.问题分析 后来发现除了这段数据查询不到,其他都能查询,于是逐步对比代码,发现其他数据都是英文的,而这句是中文的于是把条 ...

  7. OpenvSwitch端口镜像

    OVS上实现端口镜像的基本流程如下: 创建 mirror ,在 mirror 中指定镜像数据源及镜像目的地 将创建的 mirror 应用到 bridge 中 镜像数据源可以通过下面几个选项来指定: s ...

  8. Flask系列07--Flask中的CBV, 蓝图的CBV

    一.CBV使用 class base view 和django中类似 class Login(views.MethodView): # methods=["POST"," ...

  9. 201621123018《java程序设计》第13周作业总结

    1. 本周学习总结 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网络同时使用,需要为你的系统增加网络功能. 2.1 简述你想为你的系统增加什 ...

  10. MariaDB 数据类型与运算符(4)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...