c++自定义sort()函数的排序方法

2023-10-31

1. 引言

在C++中,sort()函数常常用来对容器内的元素进行排序,先来了解一下sort()函数。

sort()函数有三个参数:

  • 第一个是要排序的容器的起始迭代器
  • 第二个是要排序的容器的结束迭代器
  • 第三个参数是排序的方法,是可选的参数。默认的排序方法是从小到大排序,也就是less<Type>(),还提供了greater<Type>()进行从大到小排序。这个参数的类型是函数指针less和greater实际上都是类/结构体,内部分别重载了()运算符,称为仿函数,所以实际上less<Type>()和greater<Type>()都是函数名,也就是函数指针。我们还可以用普通函数来定义排序方法。

如果容器内元素的类型是内置类型或string类型,我们可以直接用less<Type>()或greater<Type>()进行排序。但是如果数据类型是我们自定义的结构体或者类的话,我们需要自定义排序函数,有三种写法:

  • 重载 < 或 > 运算符:重载 < 运算符,传入less<Type>()进行升序排列。重载 > 运算符,传入greater<Type>()进行降序排列。这种方法只能针对一个维度排序,不灵活
  • 普通函数:写普通函数cmp,传入cmp按照指定规则排列。这种方法可以对多个维度排序,更灵活
  • 仿函数:写仿函数cmp,传入cmp<Type>()按照指定规则排列。这种方法可以对多个维度排序,更灵活

2. 自定义排序规则

2.1 重写 < 或 > 运算符

#include <bits/stdc++.h>
using namespace std;

struct Person {
	int id;
	int age;
	Person(int id,int age):id(id),age(age){}
	//重载<运算符,进行升序排列
	bool operator < (const Person& p2) const {
		return id < p2.id;
	}
	//重载>运算符,进行降序排列
	bool operator > (const Person& p2) const {
		return id > p2.id;
	}
};

int main()
{
	Person p1(1, 10), p2(2, 20), p3(3, 30);
	vector<Person> ps;
	ps.push_back(p2);
	ps.push_back(p1);
	ps.push_back(p3);
	sort(ps.begin(), ps.end(), less<Person>());
	for (int i = 0; i < 3; i++) {
		cout << ps[i].id << " " << ps[i].age << endl;
	}
	cout << endl;
	sort(ps.begin(), ps.end(), greater<Person>());
	for (int i = 0; i < 3; i++) {
		cout << ps[i].id << " " << ps[i].age << endl;
	}
	cout << endl;
}

在这里插入图片描述

2.2 普通函数

#include <bits/stdc++.h>
using namespace std;

struct Person {
	int id;
	int age;
	Person(int id,int age):id(id),age(age){}
};

//普通函数
bool cmp(const Person& p1, const Person& p2) {
	if (p1.id == p2.id) return p1.age >= p2.age;
	return p1.id < p2.id;
}

int main()
{
	Person p1(1, 10), p2(2, 20), p3(3, 30), p4(3, 40);
	vector<Person> ps;
	ps.push_back(p2);
	ps.push_back(p1);
	ps.push_back(p3);
	ps.push_back(p4);
	sort(ps.begin(), ps.end(), cmp);//传入函数指针cmp
	for (int i = 0; i < 4; i++) {
		cout << ps[i].id << " " << ps[i].age << endl;
	}
}

在这里插入图片描述

2.3 仿函数

#include <bits/stdc++.h>
using namespace std;

struct Person {
	int id;
	int age;
	Person(int id, int age) :id(id), age(age) {}
};

//仿函数
struct cmp {
	bool operator()(const Person& p1, const Person& p2) {
		if (p1.id == p2.id) return p1.age >= p2.age;
		return p1.id < p2.id;
	}
};

int main()
{
	Person p1(1, 10), p2(2, 20), p3(3, 30), p4(3, 40);
	vector<Person> ps;
	ps.push_back(p2);
	ps.push_back(p1);
	ps.push_back(p3);
	ps.push_back(p4);
	sort(ps.begin(), ps.end(), cmp()); //传入函数指针cmp()
	for (int i = 0; i < 4; i++) {
		cout << ps[i].id << " " << ps[i].age << endl;
	}
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++自定义sort()函数的排序方法 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a

随机推荐

  • 计算机专有名词解释

    一 NMAP 二 DAS 三 NAS 四 SAN 五 FC 1 FC AE协议集 2 FC AV ARINC818 3 光纤总线特点 六 MEMERY 七 LVM 八 SCSI 特点 九 SMB 十 stordge 十一 NFS 十二 bl
  • source insight 无法查找与跳转和恢复默认设置

    1 无法搜索到工程里的文件 可能原因 下级目录没有添加 解决方法 Recursively add lower sub directories 勾选上 2 context window 不能跳转 可能原因 没有同步代码 解决方法 同步工程代码
  • Jira入门教程 敏捷开发管理(一)

    https www jianshu com p 145b5c33f7d0 简介 Jira是Atlassian公司出品的一款事务管理软件 无论是 需求 还是 BUG 或是 任务 都是 事务 的一种 所以Jira可以胜任非常多的角色 需求管理
  • https 状态码

    HTTP状态码 类别 原因短语 1 Information 信息性状态码 接受的请求正在处理 2 Success 成功状态码 请求正常处理完毕 3 Redirection 重定向状态码 需要进行附加操作已完成请求 4 Client Erro
  • 基于CentOS7.9安装部署docker(简洁版)

    安装部署 1基于官方脚本安装 不推荐 不能自行选择版本 官方文档 https docs docker com engine install centos 2 使用yum安装 阿里云文档 docker ce镜像 docker ce下载地址 d
  • The 19th Zhejiang Provincial Collegiate Programming Contest(部分题解)

    在完成三道签到之后 分别对图论 前缀 二分 大模拟上面取得突破点 但其他题集没能得到突破 仍需多加练习 A JB热爱数学 题意 给定两个数 a b 求出让a变成b的最少次数 能修改a的值为加上一个奇数 和 减去一个偶数 类型 思维题 分析各
  • vscode ssh远程输入密码之后无反应,一直提示输入密码

    用vscode进行远程服务器连接时 一直要输入密码 不断重复 始终无法链接 参考 https blog csdn net qq 33854260 article details 111255004 方法 点击view下的 command p
  • js网页模拟野火燃烧蔓延效果

    野火通过燃床蔓延是自然界的一个复杂现象 本文综述了为认识这一现象所作的研究工作 包括分析各种理化机制及通过基本物理规律构造数学模型 现有的数学模型可分为统计模型 经验模型和物理模型三类 本文着重以统一的观点评述了近五十年来所建立的各种物理模
  • 上传文件时候的accept限制文件类型.jpg、.gif、jpeg、.png、.doc、.docx、.txt、.xls、.xlsx等

    常用的 jpg image jpeg gif image gif jpeg image jpeg png image png doc application msword docx application vnd openxmlformat
  • node nginx mysql在linux的安装

    系统环境使用的阿里云ECS的CentOS 8 5 64位 nginx的安装 打开Terminal 输入以下命令安装Nginx yum install nginx 输入以下命令启动Nginx nginx 安装完成后 输入以下命令将Nginx加
  • 微信的OAuth2.0的接口配置信息修改部署Nginx

    1 新建springboot项目 package com cn wx import java io PrintWriter import java util Enumeration import javax servlet http Htt
  • 算法第三期——二分法(Python)

    目录 1 二分法 1 1 引导 猜数游戏 1 1 1 猜数游戏代码 1 2 二分法的使用条件 1 3 二分法的复杂度 2 整数二分 2 1 在单调递增序列中查找x或者x的后继 求中间值的方法 代码演示 记忆 2 2 在单调递增序列中查找x或
  • Ubuntu18.04必要安装的软件

    1 更新源 找到Software Updates 将源更新为阿里云的源 在Other Software里将Canonical Partners勾上 然后自己手动更新一下 sudo apt update sudo apt upgrade 2
  • STLINK,ST-LINK Utility无法连接单片机

    STLINK ST LINK Utility无法连接单片机 keil ST LINK Utility尝试连接最小系统板 但是无法连接 网上搜了很多教程 偶然看到一位道友说他连接空板子可以 有程序的不行 不知道为什么 因为我的板子之前也下载过
  • 中断INT 0x80的作用[转自csdn blog]

    当进程执行系统调用时 先调用系统调用库中定义某个函数 该函数通常被展开成前面提到的 syscallN的形式通过INT 0x80来陷入核心 其参数也将被通过寄存器传往核心 在这一部分 我们将介绍INT 0x80的处理函数system call
  • Python 计算机视觉

    Python 计算机视觉 from PIL import Image Image是PIL中比较重要的一个 模块 im Image open F Desktop 今日须看 代码 Python master back image bmp ims
  • python画散点图、折线图

    Python 画图 散点图scatter 保存savefig 及颜色大全 python中的散点图还可以这么画 这个针对改变描点形状 一 散点图 import numpy as np import matplotlib pyplot as p
  • MySQL之锁的使用

    MySQL表级锁的锁模式 MySQL的表级锁有两种模式 表共享读锁 Table Read Lock 和表独占写锁 Table Write Lock 锁模式的兼容性 对MyISAM表的读操作 不会阻塞其他用户对同一表的读请求 但会阻塞对同一表
  • Qt 类中Q_OBJECT的作用及其程序代码体现

    Qt中类里为什么要加上Q OBJECT这个东西呢 原来这是一个Qt定义的宏 它的作用是什么呢 原来这个宏中包含了Qt中最重要的一个机制 也就是信号和槽的机制 所有的Qt程序一定会使用这个机制 下面我们可以先看一个简单的小程序 一个类似于图片
  • c++自定义sort()函数的排序方法

    1 引言 在C 中 sort 函数常常用来对容器内的元素进行排序 先来了解一下sort 函数 sort 函数有三个参数 第一个是要排序的容器的起始迭代器 第二个是要排序的容器的结束迭代器 第三个参数是排序的方法 是可选的参数 默认的排序方法