【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )(一)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )(一)

queue 队列


1. queue 队列 : 是一个先进先出的容器 ; 下面是队列的使用流程 ;


2. 引入头文件 : 使用 queue 队列之前 , 必须先包含其头文件 , queue 队列是 STL 模板类中提供的容器 ;


//引入队列头文件 , 才能使用 queue 队列
//queue 队列 , 也是 STL 模板类中提供的容器
#include <queue>


3. 声明队列 : 格式 " queue<元素类型> 容器对象变量名称 " , 尖括号中声明了容器中存储的元素类型 , 如下代码表示该队列存储的是 int 类型元素 ;


//声明队列
  queue<int> queue_1;


4. 添加元素 : 调用队列对象的 " push( 元素变量 ) " 向 queue 队列中添加元素 ;


//添加元素到队列中 
  queue_1.push(8);
  queue_1.push(88);


5. 删除元素 : 调用 " pop() " 方法 , 将最后加入的元素弹出队列 ;


//将元素弹出队列
  queue_1.pop();


6. 获取 queue 队列首元素 : 调用队列对象的 " front() " 方法可以获取队列首元素 ;

7. 获取 queue 队列尾元素 : 调用队列对象的 " back() " 方法可以获取队列最后的元素 ;


queue_1.front();
  queue_1.back();



stack 栈


1. stack 栈 : 后进先出的容器 ;


2. 引入头文件 : 使用 queue 队列之前 , 必须先包含其头文件 , queue 队列是 STL 模板类中提供的容器 ;


//引入 stack 栈的头文件
#include <stack>


3. 声明 stack 栈 : 格式 " stack<元素类型> 容器对象变量名称 " , 尖括号中声明了容器中存储的元素类型 , 如下代码表示该 stack 栈存储的是 int 类型元素 ;


// III . stack 栈
  //stack 栈 是后进先出的容器
  stack<int> stack_1;



priority_queue 优先级队列


1. 声明优先级队列 : 声明时指定元素类型 , priority_queue 后尖括号中的类型就是其存储的元素类型 ;


//声明优先级队列
  priority_queue<int> pq;


2. 添加元素 : 向优先级队列中添加元素 , 默认最大值在队首 ;


//其默认复制数值最大的在队首 
  pq.push(88);
  pq.push(8);
  pq.push(888);


3. 获取队首元素 : 调用优先级队列对象的 " top() " 方法 , 获取队首元素 , 将其打印出来 , 默认情况下 , 队首元素是最大值 ;


//获取队首元素 , 将其打印出来 , 应该是将最大的 888 打印到了控制台
  //虽然 888 是最后添加进去的 , 但是其数值最大 , 被放在了首元素位置 
  int pq_top = pq.top();
  cout << "打印 priority_queue 优先级队列的首元素 : pq.top() : " << pq.top() << endl;


4. 代码执行结果 :


打印 priority_queue 优先级队列的首元素 : pq.top() : 888



priority_queue 优先级队列指定排序方法


1. 排序算法 : 优先级队列默认情况下 , 会将最大值放在队首 , 是因为其默认的排序算法是 less<元素类型> , 上面的 priority_queue 优先级队列其排序算法类型是 less ;


2. 指定 priority_queue 优先级队列排序算法 : 这里指定队列中元素排序算法 , 将最大值放在队尾 , 最小值在队首 ;


( 1 ) 指定三个类型 : 在 priority_queue 后的 <> 中指定 队列元素类型 , 队列中使用的内部容器 , 排序行为 三种类型 ;

( 2 ) 指定元素类型 : 队列中存储的是 int 类型元素 , 这里指定 int 类型 ;

( 3 ) 队列内部使用的容器 : 由于元素类型是 int 类型 , 这里设置 vector 即可 ;

( 4 ) 排序行为 :

① greater 是将最小值放在队尾 ;

② less : 是默认行为 , 最大的元素在前面 ;

//指定优先级队列最大值放在队尾
  //参数 1 : 代表队列中元素的类型是 int 类型
  //参数 2 : 代表优先级队列使用的内部容器 , 整个队列是基于 vector 容器的
  //参数 3 : 设置排序行为 , 这个行为是在 STL 中定义的模板类 
  //    less<int> : 是默认行为 , 最大的元素在前面
  //    greater<int> : 最小的在前面
  priority_queue< int, vector<int> , greater<int> > pq_1;
  pq_1.push(88);
  pq_1.push(8);
  pq_1.push(888);
  cout << "打印 pq_1 优先级队列的首元素 : pq.top() : " << pq_1.top() << endl;


3. 代码执行结果 :


打印 pq_1 优先级队列的首元素 : pq.top() : 8




priority_queue 优先级队列排序行为


C++ 中定义的排序方法 : 其中的 less 结构体就是优先级队列中默认使用的排序方法 ;


// STRUCT TEMPLATE greater
template <class _Ty = void>
struct greater { // functor for operator>
    _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type;
    _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type;
    _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type;
    constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator> to operands
        return _Left > _Right;
    }
};
// STRUCT TEMPLATE less
template <class _Ty = void>
struct less { // functor for operator<
    _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type;
    _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type;
    _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type;
    constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator< to operands
        return _Left < _Right;
    }
};




priority_queue 优先级队列存储自定义类型


目录
相关文章
|
4天前
|
存储 设计模式 算法
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
11 1
|
8天前
|
存储 缓存 安全
Golang深入浅出之-Go语言中的并发安全容器:sync.Map与sync.Pool
Go语言中的`sync.Map`和`sync.Pool`是并发安全的容器。`sync.Map`提供并发安全的键值对存储,适合快速读取和少写入的情况。注意不要直接遍历Map,应使用`Range`方法。`sync.Pool`是对象池,用于缓存可重用对象,减少内存分配。使用时需注意对象生命周期管理和容量控制。在多goroutine环境下,这两个容器能提高性能和稳定性,但需根据场景谨慎使用,避免不当操作导致的问题。
32 4
|
17天前
|
存储 算法 Java
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
30 0
|
24天前
|
开发工具 对象存储 Android开发
对象存储oss使用问题之C++使用OSS SDK时遍历OSS上的文件时崩溃如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
28 0
|
24天前
|
C++ 容器
约瑟夫经典问题C++,STL容器queue解法
约瑟夫经典问题C++,STL容器queue解法
14 0
|
25天前
|
程序员 索引 Python
06-python数据容器-set(集合)入门基础操作
06-python数据容器-set(集合)入门基础操作
|
1月前
|
容器
|
1月前
|
存储 安全 算法
java多线程之并发容器集合
java多线程之并发容器集合
|
2月前
|
JSON JavaScript 数据格式
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
127 2
|
20小时前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
8 0