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

简介: 【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 优先级队列存储自定义类型


目录
相关文章
|
11月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
310 2
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
650 77
|
11月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
493 3
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
493 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
设计模式 C++ 容器
c++中的Stack与Queue
c++中的Stack与Queue
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
345 21
|
12月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
772 1
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
337 7
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1024 108