一文读懂:C++ STL 学生与竞赛选手都会遇到的容器默认排序的疑惑

news/2025/10/13 17:05:02/文章来源:https://www.cnblogs.com/kkman2000/p/19138888

C++ STL 学生与竞赛选手都会遇到的疑惑。
下面我们系统讲清楚:


🧩 一、结论速览表:STL 常见数据结构默认排序方向

容器类型 默认排序方向 底层实现 比较器默认类型 改为从大到小的写法
std::set 从小到大(升序) 红黑树 std::less<T> std::set<T, std::greater<T>> s;
std::map 从小到大(key 升序) 红黑树 std::less<Key> std::map<Key, Value, std::greater<Key>> m;
std::multiset 从小到大(升序) 红黑树 std::less<T> std::multiset<T, std::greater<T>> ms;
std::priority_queue 从大到小(最大堆) 堆(vector+heap) std::less<T> std::priority_queue<T, vector<T>, std::greater<T>> pq;
std::sort 从小到大(升序) 快速排序 std::less<T> std::sort(a.begin(), a.end(), greater<T>());
std::unordered_set / map 无序(hash) 哈希表 N/A 不支持排序
std::queue / stack 无序 顺序容器封装 N/A 不支持排序

🧠 二、为什么 set 默认是升序,而 priority_queue 默认是降序?

(1)set / map 升序的逻辑:

  • 它们的底层是红黑树(平衡二叉搜索树)
  • 为了保证查找/迭代的逻辑性,默认让中序遍历结果是从小到大。
  • 所以 set<int> s; 中,s.begin() 指向最小值,s.rbegin() 才是最大值。

➡️ 优点:

  • 有序遍历自然是升序;
  • 查找上界 / 下界(upper_bound, lower_bound)逻辑统一。

(2)priority_queue 默认是最大堆(降序输出)的逻辑:

  • 底层是 vector + make_heap / push_heap / pop_heap 实现的二叉堆。
  • 默认比较器 less<T> 表示「大的优先级更高」。
  • 所以 pq.top() 永远返回当前最大元素。

➡️ 优点:

  • 更符合“优先队列”语义:优先取出“最大优先级”元素;
  • 典型应用如 Dijkstra、Huffman、Top-K 问题等。

⚙️ 三、如果要改为从大到小 / 从小到大,怎么写?

✅ 1️⃣ set / map

set<int, greater<int>> s;         // 从大到小
map<int, string, greater<int>> m; // key 从大到小

✅ 2️⃣ priority_queue

默认:

priority_queue<int> pq; // 大根堆(最大值优先)

改为小根堆:

priority_queue<int, vector<int>, greater<int>> pq; // 小根堆(最小值优先)

✅ 3️⃣ sort 排序

sort(v.begin(), v.end());             // 从小到大
sort(v.begin(), v.end(), greater<>());// 从大到小

✅ 4️⃣ multiset

multiset<int, greater<int>> ms; // 从大到小排序

📦 四、举个完整例子:set 与 priority_queue 对比演示

#include <bits/stdc++.h>
using namespace std;int main() {set<int> s1 = {3, 1, 4, 1, 5};set<int, greater<int>> s2 = {3, 1, 4, 1, 5};priority_queue<int> pq1; // 大根堆priority_queue<int, vector<int>, greater<int>> pq2; // 小根堆for (int x : {3, 1, 4, 1, 5}) pq1.push(x), pq2.push(x);cout << "set升序: ";for (int x : s1) cout << x << " ";  // 1 3 4 5cout << "\nset降序: ";for (int x : s2) cout << x << " ";  // 5 4 3 1cout << "\n大根堆: ";while(!pq1.empty()){ cout << pq1.top() << " "; pq1.pop(); } // 5 4 3 1 1cout << "\n小根堆: ";while(!pq2.empty()){ cout << pq2.top() << " "; pq2.pop(); } // 1 1 3 4 5
}

💡 五、总结口诀(记忆法)

容器 默认方向 记忆口诀
set / map 升序 树按中序 → 小到大
priority_queue 降序(最大堆) 优先取“大”的 → 最大堆
sort 升序 从小排到大
改方向 greater<T> 比较器模板换一下就行

记忆技巧

  • 关联容器(set/map):greater<T> 实现从大到小
  • 优先队列greater<T> 实现小根堆(从小到大)
  • 算法函数greater<T>() 实现从大到小排序

记住 greater 总是产生"更严格的"排序规则。

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

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

相关文章

零基础新手的以太坊质押(Staking)终极科普文章

零基础新手的以太坊质押(Staking)终极科普文章。我们将用最生活化的比喻,揭开它神秘的面纱。不再挖矿,变身“数字银行股东”:一文读懂以太坊质押 想象一下,以前的以太坊就像一个巨大的“数字挖矿游戏”,而今天,…

常见应用案例,AI应用开发流程

AI应用开发流程: 1.分析需求; 2.找对应的模型,分析匹配合适的模型; 3.下载模型,跑数据集测试 4.应用 1 文生图模型: 2 图生文: 图片文本识别,提取文本,识别车牌号: 3.识别表单文本 https://github.com/Paddl…

对数据要求高的On-the-fly

必须是有序序列(Sequence is Mandatory) 不支持无序数据集(如 Zip-NeRF 风格或许多 DeepBlending 场景)。 要求图像按顺序捕获,且连续帧之间必须有足够的重叠(理想情况下超过 2/3 的内容)。 严格的运动要求(Tr…

计算机视觉(opencv)——基于 dlib 的实时摄像头人脸检测 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【开题答辩全过程】以 springboot+美食电子商城的设计与实现为例,含有答辩的问题和答案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

程序设计实践训练(Day1) - --YZ-

程序设计实践训练(Day1)Posted on 2025-10-13 16:46 --YZ-- 阅读(0) 评论(0) 收藏 举报程序设计实践训练(Day1) 第一——判断 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+…

vmware部署win7,win2008,win2012等系统如何手动安装vmware tools

vmware部署win7,win2008,win2012等系统如何手动安装vmware toolswin10和win11都能自动安装vmware tools,但win7,win2008和win2012必须手动安装,Windows版的vmware toos镜像名称是windows.iso,路径在VMware Works…

2025 年工业 X 光机厂家最新推荐排行榜:聚焦技术领先与市场认可的优质国内企业选购指南X光检查机/食品X光机/异物检测厂家推荐

引言当前工业制造向高端化、智能化加速转型,X 光机作为核心检测设备,在集成电路、新能源电池、汽车制造等领域的作用愈发关键,是保障产品质量安全的 “工业医生”。但随着市场需求激增,X 光机品牌数量大幅增加,产…

【黑马python】基础 4.Python 循环语句 while for range

笔记汇总目录【黑马python】8天python从入门到精通 - 汇总Python 循环语句代码示例参考链接黑马-4.Python 循环语句 01-while循环的基础应用tbd

ERP不只是财务软件!如何让生产、采购、仓库都用起来?

很多企业上ERP的时候,都是满心期待的。领导层觉得,有了ERP,信息化终于能覆盖全公司,财务、生产、采购、仓库、销售都能打通,数据实时共享,效率大大提升。 可是一年两年过去了,现实情况却常常是这样:财务天天在…

2025 年国内智能炒菜机器人厂家最新推荐排行榜:聚焦餐饮降本增效需求,精选行业优质品牌云端/大师/节能/健康炒菜机器人厂家推荐

当前餐饮行业深陷人力成本高、菜品标准化难、出餐效率低的困境,智慧厨房升级成为破局关键,炒菜机器人市场需求激增。但市面上品牌繁杂,产品质量、功能优势差异大,餐饮企业难辨优劣,选购时易踩坑。为帮助餐饮企业精…

linux 系统指标 简单监控 脚本

#!/bin/bash # 系统监控脚本 - 每日执行版 # 通过crontab每天00:01触发,执行到23:59:59结束 # 使用方法:添加到crontab - 01 00 * * * /root/sys_monitor.sh# 定义日志目录和文件 LOG_DIR="/root/logs/sys_moni…

2025 年最新推荐!国内优质流量计厂家综合实力推荐榜,助力企业精准选购可靠流量测量设备涡街/超声波/液体/气体/工业流量计厂家推荐

引言在工业生产自动化进程中,流量计作为关键的流体流量测量设备,其性能稳定性、数据精准度直接关系到企业生产效率提升、运营成本控制乃至安全生产保障。当前国内流量计市场品牌繁杂,既有深耕行业多年的老牌企业,也…

宝塔项目配置CDN

核心思路 配置CDN的核心流程可以简单概括为:​​源站(你的服务器)不变 -> 域名解析指向CDN提供商 -> CDN回源到你的服务器​​ 第一步:准备工作​​一个可正常访问的网站​​:确保你的网站在宝塔面板上已经…

59. 螺旋矩阵 II 模拟过程

59. 螺旋矩阵 II 思路 用代码模拟出顺时针填充数字的过程。 每填充一圈涉及4条边:顶部、右列、底部、左列。对每条边的处理保持一致,每条边均采用左闭右开统一处理,避免出现混乱,即循环不变量原则。 不变量:坚持相…

2025 年漆包线制造厂最新推荐排行榜:极细合金 / 自粘铜包铝 / 医疗消融合金等多类型线材企业精选,助力采购商精准挑选优质品牌

引言 当前漆包线行业产能过剩问题突出,供需失衡加剧市场 “内卷”,漆包圆线领域企业扎堆、产品同质化严重,企业常以延长账期、降低加工费等方式竞争,导致行业陷入低水平循环。采购商在众多品牌中难辨优劣,亟需一份…

你真的会在SQL Plus中设置行宽吗?

你真的会在SQL Plus中设置行宽吗?2025-10-13 16:38 潇湘隐者 阅读(0) 评论(0) 收藏 举报在使用SQL Plus命令行时,经常会要设置行宽(linesize),展示的格式才能美观一些.但是你真的对行宽设置都理解透彻了吗? SET …

秒杀系统的架构(Golang 实现) - Lafite

秒杀系统的架构(Golang 实现) 12306抢票,极限并发带来的思考? 每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家…

2025 年 NMN 怎么选?Japan KSKN,抗衰领域的实力之选

随着人们生活水平的提高,对健康和抗衰老的关注度日益提升。NMN 作为一种热门的抗衰成分,逐渐走进大众视野。在众多 NMN 品牌中,Japan KSKN(日本康诺)以其独特的优势脱颖而出。一、Japan KSKN 核心实力,公司概况与…

2025 CSP-S 邮寄

(-?,9.20) 初赛准备。 每天晚上都来机房,做了几套初赛题都差不多 \(60\) 到 \(70\)。 今年 sd 居然可以同时报 -S 和 -J 了( wabc30 兴致勃勃地表示一定要打这最后一次 -J。) [9.20,9.20] 初赛,照例跟 StarsIntoSea…