sort函数对结构体|pair对组|vector容器|map排序|二维数组的第x列 的排序
目录
sort对 vector容器
sort对 vector<pair<int,int>>对组
sort对 结构体
结构体外部规定排序
结构体内部运算符重载
map容器的排序
map的键排序
map的值排序
sort对二维数组的排序
sort对 vector容器
sort()
函数可以用于对vector
容器进行排序。具体来说,sort()
函数可以接受一个表示容器的迭代器范围作为参数,然后对该范围内的元素进行排序。在排序时,我们需要传入一个比较函数,用于告诉sort()
函数如何比较元素。 下面是一个示例代码,演示如何使用sort()
函数对vector
容器进行排序:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};sort(nums.begin(), nums.end()); // 默认升序排序for(auto num : nums) {cout << num << " ";}cout << endl;sort(nums.begin(), nums.end(), greater<int>()); // 降序排序for(auto num : nums) {cout << num << " ";}cout << endl;return 0;
}
输出结果为:
1 1 2 3 3 4 5 5 5 6 9
9 6 5 5 5 4 3 3 2 1 1
在上面的代码中,我们创建了一个名为nums
的vector
容器,并初始化了一些整数值。然后,我们先调用了一次sort()
函数,对容器中的元素进行升序排序,并使用一个循环打印出排序后的结果。接着,我们又调用了一次sort()
函数,并传入了一个比较函数greater<int>()
,用于告诉sort()
函数按照降序排序。最后,我们再次使用一个循环打印出排序后的结果。 需要注意的是,sort()
函数会修改容器中的元素顺序,因此在排序前最好将容器备份一下,以免意外修改到原有数据。
sort对 vector<pair<int, int>>排序
要对vector<pair<int,int>>
的第二个元素进行排序,可以使用sort()
函数来实现。使用sort()
函数需要传入三个参数,第一个参数是要排序的起始位置,第二个参数是要排序的结束位置,第三个参数是一个函数指针,用于指定排序的规则。 下面是一个示例代码,演示如何对vector<pair<int,int>>
的第二个元素进行升序排序:
//对第二元素排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {return a.second < b.second;
}
int main() {vector<pair<int, int>> v = {{1, 4}, {2, 2}, {3, 5}, {4, 1}, {5, 3}};sort(v.begin(), v.end(), cmp);for(auto p : v) {cout << p.first << " " << p.second << endl;}return 0;
}
输出结果:
4 1
2 2
5 3
1 4
3 5
在上面的代码中,我们定义了一个比较函数cmp()
,用于指定排序规则。这个函数接受两个参数,都是pair<int,int>
类型的引用。它会比较这两个pair
的第二个元素,如果第一个pair
的第二个元素小于第二个pair
的第二个元素,就返回true
,否则返回false
。 然后,在main()
函数中,我们创建了一个vector<pair<int,int>>
类型的变量v
,并初始化了一些值。然后,我们调用sort()
函数对v
进行排序。最后,我们使用一个循环打印出排序后的结果。
值得注意的是,如果是对第一个元素进行排序,则不需要cmp函数,因为sort默认对第一个元素排序
//对第一元素排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
// return a.second < b.second;
//}
int main() {vector<pair<int, int>> v = { {1, 4}, {2, 2}, {3, 5}, {4, 1}, {5, 3} };sort(v.begin(), v.end());for (auto p : v) {cout << p.first << " " << p.second << endl;}return 0;
}
输出:
1 4
2 2
3 5
4 1
5 3
sort对 结构体
结构体外部规定排序
对结构体排序和对vector
的排序类似,也是使用sort()
函数来实现。不同之处在于,需要指定一个比较函数来告诉sort()
函数如何比较结构体对象。 下面是一个示例代码,演示如何对一个包含多个字段的结构体进行排序:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Person {string name;int age;double salary;
};
bool cmpAge(const Person& p1, const Person& p2) {return p1.age < p2.age; // 按照年龄升序排序
}
bool cmpSalary(const Person& p1, const Person& p2) {return p1.salary > p2.salary; // 按照工资降序排序
}
int main() {vector<Person> people = {{"Alice", 25, 4000.0},{"Bob", 30, 5000.0},{"Charlie", 20, 3000.0},{"David", 35, 6000.0},};sort(people.begin(), people.end(), cmpAge);cout << "按照年龄升序排序:" << endl;for(auto p : people) {cout << p.name << " " << p.age << " " << p.salary << endl;}sort(people.begin(), people.end(), cmpSalary);cout << "按照工资降序排序:" << endl;for(auto p : people) {cout << p.name << " " << p.age << " " << p.salary << endl;}return 0;
}
输出结果为:
按照年龄升序排序:
Charlie 20 3000
Alice 25 4000
Bob 30 5000
David 35 6000
按照工资降序排序:
David 35 6000
Bob 30 5000
Alice 25 4000
Charlie 20 3000
在上面的代码中,我们定义了一个名为Person
的结构体,其中包含了姓名、年龄和工资三个字段。然后,我们又定义了两个比较函数cmpAge()
和cmpSalary()
,分别用于按照年龄升序和按照工资降序排序。 在main()
函数中,我们创建了一个包含四个Person
对象的vector
,并初始化了一些值。然后,我们分别调用了两次sort()
函数,分别按照年龄升序和按照工资降序排序。最后,我们使用两个循环分别打印出排序后的结果。
结构体内部运算符重载
在结构体内重载运算符,可以使我们更方便地对结构体进行排序。在C++中,可以通过重载小于号运算符<
来实现结构体的排序。具体来说,如果我们想要按照某个字段升序排序,只需要在结构体中定义一个小于号运算符的重载函数,然后在排序时传入该函数即可。 下面是一个示例代码,演示如何在结构体内重载小于号运算符,并用sort()
函数对该结构体进行排序:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Person {string name;int age;double salary;bool operator < (const Person& other) const {return age < other.age; // 按照年龄升序排序}
};
int main() {vector<Person> people = {{"Alice", 25, 4000.0},{"Bob", 30, 5000.0},{"Charlie", 20, 3000.0},{"David", 35, 6000.0},};sort(people.begin(), people.end());for(auto p : people) {cout << p.name << " " << p.age << " " << p.salary << endl;}return 0;
}
输出结果为:
Charlie 20 3000
Alice 25 4000
Bob 30 5000
David 35 6000
在上面的代码中,我们在Person
结构体中重载了小于号运算符<
,使其按照年龄升序排序。在main()
函数中,我们创建了一个包含四个Person
对象的vector
,并初始化了一些值。然后,我们调用了一次sort()
函数,传入了一个空的比较函数,因为我们已经在Person
结构体内重载了小于号运算符。最后,我们使用一个循环打印出排序后的结果。 需要注意的是,重载小于号运算符时,需要将运算符重载函数声明为const
成员函数,这是因为排序函数需要保证比较操作不会修改结构体的内容。
map容器的排序
map的键排序
map
容器本身是有序的,因此不需要使用sort()
函数对其进行排序。map
容器是一种关联容器,其中的元素是按照键值有序排列的,因此我们可以说map
容器本身就已经是排序好的了。 如果我们需要对map
容器进行遍历,可以使用迭代器来访问其中的元素。map
容器的迭代器按照键值升序排列,因此我们可以直接使用一个循环来遍历map
容器中的所有元素。 下面是一个示例代码,演示如何使用迭代器遍历map
容器:
#include <iostream>
#include <map>
using namespace std;
int main() {map<string, int> scores = {{"Alice", 80},{"Bob", 70},{"Charlie", 90},{"David", 85},};for(auto it = scores.begin(); it != scores.end(); ++it) {cout << it->first << ": " << it->second << endl;}return 0;
}
输出结果为:
Alice: 80
Bob: 70
Charlie: 90
David: 85
在上面的代码中,我们创建了一个名为scores
的map
容器,并初始化了一些键值对。然后,我们使用一个迭代器it
遍历map
容器中的所有元素,并打印出每个键值对的键和值。 需要注意的是,map
容器的键和值是一一对应的,因此在遍历map
容器时,需要使用迭代器的first
和second
成员来访问键和值。在上面的代码中,it->first
代表当前迭代器指向的键,it->second
代表当前迭代器指向的值。
map的值排序
map
容器中的元素是按照键值有序排列的,因此无法直接使用sort()
函数对其值进行排序。但是,我们可以将map
容器中的键值对复制到一个vector
容器中,然后对vector
容器中的元素进行排序,最后再将排序后的结果更新到map
容器中。 下面是一个示例代码,演示如何使用vector
容器对map
容器中的值进行排序:
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {map<string, int> scores = {{"Alice", 80},{"Bob", 70},{"Charlie", 90},{"David", 85},};vector<pair<string, int>> vec;for(auto it = scores.begin(); it != scores.end(); ++it) {vec.push_back(*it);}sort(vec.begin(), vec.end(), [](pair<string, int>& a, pair<string, int>& b){return a.second > b.second; // 按值降序排列});scores.clear();for(auto& p : vec) {scores.insert(p);}for(auto it = scores.begin(); it != scores.end(); ++it) {cout << it->first << ": " << it->second << endl;}return 0;
}
输出结果为:
Charlie: 90
David: 85
Alice: 80
Bob: 70
在上面的代码中,我们首先创建了一个名为scores
的map
容器,并初始化了一些键值对。然后,我们创建了一个vector
容器vec
,并使用循环将scores
中的键值对复制到vec
中。接着,我们调用了sort()
函数并传入一个比较函数,用于按照值降序排列vec
中的元素。由于vec
中的元素是键值对,因此我们需要在比较函数中指定按照second
成员排序。最后,我们清空了scores
容器,再使用循环将排序后的键值对插入到scores
容器中,并使用迭代器遍历scores
容器,打印出每个键值对的键和值。 需要注意的是,在将排序后的键值对插入到map
容器中时,我们使用了insert()
函数,而不是直接使用=
赋值运算符。这是因为map
容器中的元素是按照键值有序排列的,因此如果我们直接使用=
赋值运算符,可能会破坏原有的顺序关系。而使用insert()
函数可以保证插入的新元素仍然按照键值有序排列。
sort对二维数组的排序
二维数组可以看作是一个包含若干个一维数组的数组,因此可以使用sort()
函数对其进行排序。但是,需要注意的是,在使用sort()
函数对二维数组排序时,需要自定义比较函数,以指定按照哪个元素进行排序。 下面是一个示例代码,演示如何使用sort()
函数对二维数组进行排序:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {int a[][3] = {{3, 1, 4},{2, 8, 5},{9, 7, 6},};int n = sizeof(a) / sizeof(a[0]); // 行数int m = sizeof(a[0]) / sizeof(int); // 列数sort(a, a + n, [](int* x, int* y){return x[1] < y[1]; // 按第二列升序排列});for(int i = 0; i < n; ++i) {for(int j = 0; j < m; ++j) {cout << a[i][j] << ' ';}cout << endl;}return 0;
}
输出结果为:
3 1 4
9 7 6
2 8 5
在上面的代码中,我们定义了一个名为a
的二维数组,其中包含了三个一维数组,每个一维数组有三个元素。然后,我们使用sizeof()
运算符计算出了行数和列数,并调用了sort()
函数,并传入一个比较函数,用于按照第二列升序排列二维数组中的元素。由于sort()
函数对于二维数组的排序需要在比较函数中指定按照哪个元素排序,因此我们在比较函数中指定了按照第二列排序。最后,我们使用两个嵌套循环遍历二维数组,并打印出每个元素的值。 需要注意的是,在比较函数中,我们使用了指针来表示二维数组中的一维数组。这是因为二维数组在传递给函数时,会自动转换为指向其第一行的指针,因此在比较函数中可以直接使用指针来表示一维数组。
相关文章:

sort函数对结构体|pair对组|vector容器|map排序|二维数组的第x列 的排序
目录 sort对 vector容器 sort对 vector<pair<int,int>>对组 sort对 结构体 结构体外部规定排序 结构体内部运算符重载 map容器的排序 map的键排序 map的值排序 sort对二维数组的排序 sort对 vector容器 sort()函数可以用于对vector容器进行排序。具体来…...

Java定时器Timer的使用
一、Timer常用方法 Timer应用场景: 1、每隔一段时间执行指定的代码逻辑(即按周期执行任务) 2、指定时间执行指定的代码逻辑 为方便测试并查看运行效果,首先先建一个类并继承TimerTask,代码如下: package timerTest…...

MySQL安装和配置
下载官网下载mysql解压版本:配置环境变量下载完成后直接解压到需要放的文件夹,根据文件夹来配置环境变量;新建系统变量,变量名自取,值是MySQL的目录编辑path环境变量,加上MySQL的bin目录 %MYSQL_HOME%\bin配…...

openpnnp - 载入板子后,要确定板子的放置角度
文章目录openpnnp - 载入板子后,要确定板子的放置角度概述用openpnp提供的功能来确定被夹住的板子的左下角原点位置和板子的角度备注ENDopenpnnp - 载入板子后,要确定板子的放置角度 概述 设备是有夹具的, 用百分表打过, 夹具本身在Z方向的平行度是没问题的. 但是, PCB板子的…...

HCIP知识点(前三天)
复习HCIA: 一、TCP/IP模型,OSI模型 OSI 开放式系统互联参考模型 应用层 抽象语言—>编码 表示层 编码—>二进制 会话层 应用程序内部的区分地址(无标准格式) 传输层 TCP/UDP – 分段(受MTU限制)、端…...

模板学堂丨妙用Tab组件制作多屏仪表板并实现自动轮播
DataEase开源数据可视化分析平台于2022年6月正式发布模板市场(https://dataease.io/templates/)。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板,方便用户根据自身的业务需求和使用场景选择对应的仪表板模板,并…...

C++:初识函数模板和类模板
目录 一. 泛型编程 二. 函数模板 2.1 什么是函数模板 2.2 函数模板的实例化 2.2.1 函数模板的隐式实例化 2.2.1 函数模板的显示实例化 2.3 函数模板实例化的原理 2.4 模板函数调用实例化原则 三. 类模板 3.1 什么是类模板 3.2 类模板的实例化 一. 泛型编程 泛型编程…...
3.8妇女节如何做好TikTok网红营销?
3月8日是国际妇女节,这一节日已经成为全球关注女性权益和平等的标志性日子,TikTok上话题#internationalwomensday累计播放超10亿次,话题#WomensDay2023累计播放量也将近300万次。 这个特别的日子为品牌提供了一个很好的营销机会。据Nox聚星了…...

使用Advanced Installer打包程序及运行环境
Advanced Installer 工具版本:20.1.1 设置产品信息 选中右侧【Product Details】输入产品信息 设置文件和文件夹 添加使用VS发布之后的程序文件夹 设置文件夹刷新 选中文件夹,右键选择属性,选中Synchronize标签。启用“Synchronize conten…...
华为OD机试真题Python实现【计算堆栈中的剩余数字】真题+解题思路+代码(20222023)
计算堆栈中的剩余数字 题目 向一个空栈中依次存入正整数 假设入栈元素N(1<=N<=2^31-1) 按顺序依次为Nx … N4、N3、N2、N1, 当元素入栈时,如果N1=N2+...Ny(y的范围[2,x],1 <= x <= 1000) 则 N1 到 Ny 全部元素出栈,重新入栈新元素M(M=2*N1) 如依次向栈存储6、1、…...

企业文件数据泄露防护(DLP)
什么是数据丢失防护 数据丢失防护 (DLP) 是保护数据不落入坏人之手的做法。如今,数据传输的主要问题是使大量数据容易受到未经授权的传输。通过设置足够的安全边界,您可以控制数据在网络中的移动。由于您的数据非常有价值&#x…...

不考虑分配与合并情况下,GO实现GCMarkSweep(标记清楚算法)
观前提醒 熟悉涉及到GC的最基本概念到底什么意思(《垃圾回收的算法与实现》)我用go实现(因为其他的都忘了,(╬◣д◢)ムキー!!) 源码地址(你的点赞,是我开源的…...

利用HGT聚类单细胞多组学数据并推理生物网络
单细胞多组学数据允许同时对多种组学数据进行定量分析,以捕捉复杂的分子机制和细胞异质性。然而现有的工具不能有效地推断不同细胞类型的活性生物网络以及这些网络对外部刺激的反应。 来自:Single-cell biological network inference using a heterogen…...

杂记——18.VSCode的下载及使用
这篇文章,我们来讲一下VSCode,讲一下如何下载及使用VSCode 目录 1.VSCode的下载 1.1VSCode的简介 1.2VSCode的下载与安装 1.2.1下载 1.2.2安装 2.VSCode的使用 2.1界面 2.2基础设置 2.3禁用自动更新 2.3自动保存设置 2.4Vscode更换主题 2.5…...
【独家】华为OD机试 - 最少停车数(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

顶级动漫IP加持之下,3A策略游戏Mechaverse如何改变GameFi
2021年是元宇宙发展的元年,元宇宙与GameFi创造了一波又一波市场热点。在经历第一波热潮之后,元宇宙的到来让不少人看到了加密市场的潜力,同时大家也意识到这将是未来的重要方向。如何将元宇宙推向更广阔的市场,让更多人能够轻松进…...

一款丧心病狂的API测试工具:Apifox!
你好,我是测试开发工程师——凡哥。欢迎和我交流测试领域相关问题(测试入门、技术、python交流都可以) 我们平时在做接口测试的时候,对于一些常用的接口测试工具的使用应该都非常熟悉了: 接口文档:Swagge…...

【前端学习】D2-2:CSS基础
文章目录前言系列文章目录1 Emmet语法1.1 快速生成HTML语法结构1.2 快速生成CSS样式语法1.3 快速格式化代码2 CSS复合选择器2.1 什么是复合选择器2.2 后代选择器(*)2.3 子选择器2.4 并集选择器(*)2.5 伪类选择器2.6 链接伪类选择器…...
Flink / Scala 实战 - 19.ProcessFunction 删除 key 的上一个定时器 TimeTimer
一.引言 ProcessFunction 原始执行状态为每个 key 注册一个较长时间 TimeTimer 并在这期间将所有对应 key 的数据都收集起来,到期完成触发。现在接到新的需求,要求判断数据类型,当特殊标识的数据到达后,需要将 TimeTimer 到期的时间提前。因此需要删掉当前 key 之前注册的老…...

MSTP基础
MSTP基础引入背景技术概览PVSTP(过渡)MSTP单生成树的缺陷1:部分VLAN不通单生成树的缺陷2:无法实现流量的负载分担多生成树解决单生成树实例引入背景 RSTP在STP基础上进行了改进,实现了网络拓扑快速收敛。但由于局域网…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...