当前位置: 首页 > news >正文

c++ STL 容器相关

容器库:容器库 - cppreference.com

一、std::priority_queue

#include <queue>
template<class T,class Container = std::vector<T>,class Compare = std::less<typename Container::value_type>
> class priority_queue;

优先级队列是一种容器适配器,它提供常数时间的(默认)最大元素查找,对数代价的插入与提取。可以通过用户提供的 Compare 更改顺序,例如,用 std::greater<T> 将导致最小元素作为 top() 出现。priority_queue 的作用类似于管理某些随机访问容器中的堆,其优势是不可能意外使堆失效。

1.模板形参

T-存储元素的类型。T 与 Container::value_type 不是同一类型时非良构。
Container-用于存储元素的底层容器类型。容器必须满足序列容器 (SequenceContainer) 的要求,并且它的迭代器必须满足老式随机访问迭代器 (LegacyRandomAccessIterator) 的要求。另外,它必须提供拥有通常语义的下列函数:
  • back(),例如 std::vector::back(),
  • push_back(),例如 std::deque::push_back(),
  • pop_back(),例如 std::vector::pop_back()。

标准容器 std::vector(包括 std::vector<bool>)和 std::deque 满足这些要求。

Compare-提供严格弱序的比较 (Compare) 类型。

注意比较 (Compare) 形参的定义,使得它的第一实参在弱序中 先于 它的第二实参时返回 true。但因为优先级队列首先输出最大元素,所以“先来”的元素实际上会在最后输出。即队列头含有按照比较 (Compare) 所施加弱序的“最后”元素。

成员类型
类型               定义
container_type    Container
value_compare     Compare
value_type        Container::value_type
size_type         Container::size_type
reference         Container::reference
const_reference   Container::const_reference 
成员对象
名字	          定义
Containerc        底层容器(受保护成员对象)
Compare comp      比较函数对象(受保护成员对象)

 

 

#include <functional>
#include <iostream>
#include <queue>
#include <string_view>
#include <vector>template<typename T>
void pop_println(std::string_view rem, T& pq)
{std::cout << rem << ": ";for (; !pq.empty(); pq.pop())std::cout << pq.top() << ' ';std::cout << '\n';
}template<typename T>
void println(std::string_view rem, const T& v)
{std::cout << rem << ": ";for (const auto& e : v)std::cout << e << ' ';std::cout << '\n';
}int main()
{const auto data = {1, 8, 5, 6, 3, 4, 0, 9, 7, 2};println("data", data);std::priority_queue<int> max_priority_queue;// 填充优先级队列。for (int n : data)max_priority_queue.push(n);pop_println("max_priority_queue", max_priority_queue);// std::greater<int> 使得最大优先队列表现为最小优先队列。std::priority_queue<int, std::vector<int>, std::greater<int>>min_priority_queue1(data.begin(), data.end());pop_println("min_priority_queue1", min_priority_queue1);// 定义最小优先队列的另一种方法std::priority_queue min_priority_queue2(data.begin(), data.end(), std::greater<int>());pop_println("min_priority_queue2", min_priority_queue2);// 使用自定义的函数对象来比较元素。struct{bool operator()(const int l, const int r) const { return l > r; }} customLess;std::priority_queue custom_priority_queue(data.begin(), data.end(), customLess);pop_println("custom_priority_queue", custom_priority_queue);// 使用 lambda 来比较元素。auto cmp = [](int left, int right) { return (left ^ 1) < (right ^ 1); };std::priority_queue<int, std::vector<int>, decltype(cmp)> lambda_priority_queue(cmp);for (int n : data)lambda_priority_queue.push(n);pop_println("lambda_priority_queue", lambda_priority_queue);
}
#include <iostream>
#include <queue>
#include <vector>
#include <functional>template<typename T>void print_queue(T& q){while(!q.empty()){std::cout << q.top() << " " ;q.pop();}std::cout << '\n';
}int main(){std::priority_queue<int> q;for(int n:{1,9,2,8,3,7,4,6,5,0})q.push(n);print_queue(q);std::priority_queue<int, std::vector<int>, std::greater<int>> q1;for(int n:{1,9,2,8,3,7,4,6,5,0})q1.push(n);print_queue(q1);auto cmp = [](int left, int right){return (left) > (right);};std::priority_queue<int, std::vector<int>, decltype(cmp) > q3(cmp);for(int n:{99,11,88,22,77,33,66,44,55})q3.push(n); print_queue(q3);ereturn 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt窗口 菜单栏 QMenuBar和的使用及说明
  • java03
  • 2024全国大学生数学建模国赛,成员如何分工协作?
  • sheng的学习笔记-AI-半监督聚类
  • Golang时间格式化的陷阱与解决方案
  • 一点小小的做事经验
  • 5Kg负重30分钟长航时多旋翼无人机详解
  • Linux命令行更换yum源repo为阿里源-centos7
  • CSS中的`z-index`属性是如何工作(注意事项)
  • idea对项目中的文件操作没有权限
  • Stable Diffusion绘画 | LightFlow工作流插件:一键导入,高效生图
  • URP custompasscustom render objects
  • JAVA中有关锁的详解
  • Stable Diffusion 使用详解(10)--- 场景立体字
  • Docker php文件本地包含--pearcmd.php利用
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android交互
  • CentOS6 编译安装 redis-3.2.3
  • cookie和session
  • java8-模拟hadoop
  • Java应用性能调优
  • JSONP原理
  • Next.js之基础概念(二)
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Service Worker
  • V4L2视频输入框架概述
  • 关于使用markdown的方法(引自CSDN教程)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 少走弯路,给Java 1~5 年程序员的建议
  • 思考 CSS 架构
  • 跳前端坑前,先看看这个!!
  • 找一份好的前端工作,起点很重要
  • 7行Python代码的人脸识别
  • 如何在招聘中考核.NET架构师
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Linux(make工具和makefile文件以及makefile语法)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #QT(TCP网络编程-服务端)
  • #每日一题合集#牛客JZ23-JZ33
  • #知识分享#笔记#学习方法
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (31)对象的克隆
  • (bean配置类的注解开发)学习Spring的第十三天
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Ruby)Ubuntu12.04安装Rails环境
  • (十八)Flink CEP 详解
  • (四) Graphivz 颜色选择
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 成都线下面基会拉开序幕
  • .net core 管理用户机密
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .ui文件相关