c++ STL 容器相关

devtools/2024/9/25 10:40:07/

容器库:容器库 - 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;
}


http://www.ppmy.cn/devtools/103973.html

相关文章

[Leetcode 435][Medium]-无重叠区间-贪心

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 题目地址 二、整体思路 要求移除区间的最小个数&#xff0c;也就是要求使得剩余区间互不重叠的最大区间数。 可以先将区间按右端点的值进行升序排序,然后遍历数组&#xff0c;在此基础上保留左端点>最小右端点的值…

【随记】开源 AI(Open source AI)

开源 AI(Open source AI) 1. 开源AI的重要性 2. 主要开源AI框架和工具 3. 开源AI项目的典型应用 4. 参与开源AI社区的好处 5. 开源AI的挑战与风险 6. 未来展望 &#x1f388;边走、边悟&#x1f388;迟早会好 开源人工智能&#xff08;Open Source AI&#xff09;指的是…

EmguCV学习笔记 VB.Net 8.2 分水岭法 watershed

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

数据结构与算法 第5天(树和二叉树)

树形结构 一对多 只有一个前驱 可以有多个后继 树的定义 基本术语 有序树&#xff1a;树中结点的各子树从左至右有次序(最左边的为第一个孩子) 森林&#xff1a;是 m(m≥0)棵互不相交的树的集合。 一棵树可以看成特殊的森林 二叉树 每个节点最多有两个…

这几天旅游去了,刚回来,有几点感想

这几天旅游去了&#xff0c;刚回来&#xff0c;有几点感想&#xff1a; 一、不要抱怨外部环境差&#xff0c;你无法适应&#xff0c;不代表别人无法适应 从疫情开始&#xff0c;就一直有一个声音&#xff0c;抱怨说自己不赚钱是因为外部环境差&#xff0c;有理由可以摆烂了。…

Python爬虫所需的技术及其原理(简单易懂)

导言 随着互联网的发展&#xff0c;大量的数据被存储在网络上&#xff0c;而我们需要从中获取有用的信息。Python作为一种功能强大且易于学习的编程语言&#xff0c;被广泛用于网络爬虫的开发。本文将详细介绍Python爬虫所需的技术及其原理&#xff0c;并提供相关的代码案例。…

虚拟化设置和虚拟机相关的环境搭建

目录 0.首先声明 1.背景知识 ​编辑 2.虚拟化设置 3.安装vm15.5过程 4.安装虚拟系统 4.1下载centos7.6 4.2安装centos7.6 5.我的总结 6.我的体会 0.首先声明 我的这个教程参考的就是韩顺平老师的这个linux学习教程&#xff0c;但是这个韩老师的这个教程就是2020年的教…

AI 内容创作:思考与实践

文章目录 LLM 与 RAGLLMRAGRAG 定制策略AI 写作助手演示 内容层次结构与内容深度优化有效的主题与段落结构内容深度的多样性与独特性提高文本逻辑性与连贯性模拟实践 内容评测与优化迭代机制内容评测自动迭代优化机制评估指标模拟实践 个性化写作与 AI 协同写作用户画像与需求分…