c++ STL 容器相关

news2024/9/20 22:40:21

容器库:容器库 - 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);e
    return 0;
}

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

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

相关文章

学习资料销售平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;资料类型管理&#xff0c;学习资料管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;学习资料&#xff0c;购物车&#xff0c;…

C/C++二维码生成库qrencode编译与使用

1 qrencode介绍 qrencode 是一个用于生成 QR 码&#xff08;Quick Response Code&#xff09;的工具和库。QR 码是一种矩阵条形码或二维条形码&#xff0c;能够在水平和垂直方向上存储信息。qrencode 支持多种编码方式&#xff0c;并能够生成不同复杂度和错误校正级别的 QR 码…

计算机组成原理:实验四常规型微程序控制器组成实验

一、实验目的 1.掌握时序产生器的组成原理。 2.掌握微程序控制器的组成原理。 3.掌握微指令格式的化简和归并。 二、实验电路 1.时序发生器 TEC-4计算机组成原理实验系统的时序电路如图4.1所示。电路采用2片GAL22V10&#xff08;U6、U7&#xff09;&#xff0c;可产生两极…

微信小程序App实现小车方向控制

目录 概述 1 系统框架结构 1.1 结构介绍 1.2 硬件模块介绍 1.2.1 蓝牙模块介绍 1.2 .2 模块功能介绍 2 功能实现 2.1 微信小程序APP 2.2 下位机功能 3 功能测试 3.1 小程序UI测试 3.2 小车方向控制 微信小程序和蓝牙模块控制小车运行状态 概述 本文主要介绍使用微信…

vue.js项目实战案例源码

Vue.js是一个用于构建用户界面的渐进式框架&#xff0c;非常适合开发单页面应用。以下是一些实战案例的源码&#xff0c;可以帮助你更好地理解和使用Vue.js&#xff1a; Vue TodoMVC 简介&#xff1a;这是学习Vue.js的入门级项目&#xff0c;主要实现了一个待办事项列表。源码地…

Python优化算法17——黄金正弦算法(GSA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

从 CRX 文件安装 Chrome 扩展程序

在使用嵌入式 Browser 中的扩展程序时&#xff0c;您可能希望将它们打包并分发在应用程序中&#xff0c;并静默安装。 在本教程中&#xff0c;我将演示如何通过编程方式从 CRX 文件中安装扩展程序&#xff0c;保持它们的更新&#xff0c;并使用它们。 此外&#xff0c;我还会…

8.30工作笔记

要做的事情&#xff1a; 1 测试剩下的三个因子&#xff1a;coppock 潮汐因子 云开雾散 2 整理需要时间序列的因子 以及截面因子 3 灾后重建多了一列&#xff0c;灾后重建’所有值都是nan&#xff0c;这里不仅是灾后重建&#xff0c;所有的都要改 4 coppock 潮汐因子 云开雾散在…

排列数+时间戳+逆元取模

前言&#xff1a;这个题目是真的难&#xff0c;不会做&#xff0c;看了题解才发现是咋回事 题目地址 最主要的就是为啥是除以3&#xff0c;c之前需要完成a 和 b&#xff0c;d 和 e 对我们的答案没有影响&#xff0c;所以我们要除以 A(3,3) ,但是 a 和 b 的排列没有要求&#xf…

Sinc Function介绍

1、定义 Sinc函数全称&#xff1a;sine cardinal&#xff0c;也称作是sampling function&#xff08;采样函数&#xff09;。 2、分类 &#xff08;1&#xff09;归一化sinc函数&#xff1a; 这种定义在信号处理中被广泛采用&#xff0c;其中 x 是一个无量纲的变量&#xff0c;…

基于YOLO的车牌检测识别(YOLO+Transformer)

概述&#xff1a; 基于深度学习的车牌识别&#xff0c;其中&#xff0c;车辆检测网络直接使用YOLO侦测。而后&#xff0c;才是使用网络侦测车牌与识别车牌号。 车牌的侦测网络&#xff0c;采用的是resnet18&#xff0c;网络输出检测边框的仿射变换矩阵&#xff0c;可检测任意形…

同城小程序怎么做 同城小程序系统开发制作方案

很多同城创业的老板们想要做一个同城小程序但是不知道怎么做&#xff0c;本次瀚林就为大家详细介绍一下做同城小程序系统开发制作方法&#xff0c;给大家做个参考。 目前同城类型的小程序系统市面上比较常见的有&#xff1a;同城配送、鲜花订花、同城上门服务、同城跑腿、同城便…

中仕公考怎么样?事业编考试怎么备考?

事业编考试备考可以大致分为三个阶段&#xff0c;按照不同阶段根据自身的学习情况制定不同的学习计划即可。 ①基础阶段 有备考经验的考生可以忽略这一步&#xff0c;刚开始先打好基础很重要&#xff0c;根据课程和教材理解知识点&#xff0c;按照模块学习&#xff0c;对考试…

cnocr 安装

打开终端 如果不会打开终端 -> 终端打开输入 pip install cnocr 执行中途可能报错 去这里下载工具&#xff1a;c构建工具下载完打开&#xff0c;勾选这个 然后点安装安装完回到第2步重新执行

docker镜像所使用到的COW写时复制技术是什么

copy on write 简单来说&#xff0c;所有的读操作都是指向一份内存地址&#xff0c;共享这些数据&#xff0c;节省内存空间。 如果有进程要对数据进行写操作&#xff0c;系统会检测到这个行为&#xff0c;将数据复制一份出来&#xff0c;给这个进程进行写操作。其他进程继续…

5.3二叉树——二叉树链式结构实现

本篇博客梳理二叉树链式结构 明确&#xff1a;二叉树是递归定义的 递归的本质&#xff1a;当前问题子问题&#xff0c;返回条件是最小规模的子问题 一、二叉树的遍历 1&#xff0e;前序、中序与后序遍历 &#xff08;1&#xff09;前序&#xff1a;根->左子树->右子树…

全球知名度最高的华人颜廷利:世界公认十大思想家哲学家

全球知名度最高的华人颜廷利&#xff1a;世界公认十大思想家哲学家 在汉语这一中国优秀传统文化的瑰宝中&#xff0c;“色”与“舍”这两个字的发音分别被解读为“思恶”和“识恶”&#xff0c;揭示了一种深奥的文化现象。这种现象的根源&#xff0c;实则来自于我们的感官——眼…

linux上查找某应用所在的绝对路径

linux上查找某应用所在的绝对路径 1、已知应用名称 找到应用的进程号 例&#xff1a;查找nginx的进程号 ps -ef | grep nginx 或者 ps -aux | grep nginx 2、通过端口号找进程号 lsof -i:80 3、通过进程号找到所在目录&#xff0c;Linux在启动一个进程时,系统会在/proc目…

力扣刷题(3)

整数反转 整数反转-力扣 思路&#xff1a; 利用%和/不断循环取待反转整数的最后一位&#xff0c;注意判断是否超出范围。 int reverse(int x){int y0;while(x){if(y > INT_MAX/10 || y < INT_MIN/10)return 0;int tmpx%10;yy*10tmp;x/10;}return y; }字符串转换整数 …

多线程篇(基本认识 - 锁优化)(持续更新迭代)

目录 一、前言 二、阿里开发手册 三、synchronized 锁优化的背景 四、Synchronized的性能变化 1. Java5之前&#xff1a;用户态和内核态之间的切换 2. java6开始&#xff1a;优化Synchronized 五、锁升级 1. 无锁 2. 偏向锁 2.1. 前言 2.2. 什么是偏向锁 2.3. 偏向…