C++ queue (STL容器适配器)

曾经终败给现在 2023-06-08 03:20 48阅读 0赞

目录

适配器

queue

queue的使用

queue的模拟实现


适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),适配器是将一个类的接口转换成客户希望的另外一个接口。

举个栗子, 咱们香港的插头和我们内地是不一的, 如下图, 这种插头在咱们内地是不方便使用的, 要是香港同胞到对岸深圳转一转, 被繁华的深圳所吸引, 不禁多留了两天, 那这时候手机要充电怎么充电啊, 不过没关系, 我们有适配器, 其实真正给手机充电的还是手机充电器, 适配器只是方便了人们的使用而已 . watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70
港版充电器 适配器 适配器的使用

常见的容器适配器有stack , queue, priority_queue, 它们就相当于上图的适配器, 真正给手机充电的是还是充电头, 同样的道理, 它们底层是靠别的容器实现的
例如:
stack可以用vector, deque, list实现.
queue可以用 deque, list实现
priority_queue, 可以用 deque, vector实现

queue

  1. 队列是一种容器适配器,专门用于在(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
  2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

empty:检测队列是否为空
size:返回队列中有效元素的个数
front:返回队头元素的引用
back:返回队尾元素的引用
push_back:在队列尾部入队列
pop_front:在队列头部出队列

  1. 标准容器类deque和list满足了这些要求。默认情况下,如果没有实例化指定容器,则使用标准容器deque。
  2. 需要头文件#include
  3. 为什么选择deque作为queue的底层默认容器
    主要原因
    deque优点: 两端插入删除最快的
    deque缺点: 迭代器复杂效率低
    queue利用了优点规避了缺点, 在两端插删, 且并未使用迭代器, 所以deque最优

queue图示 :
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70 1

C++STL容器适配器之stack
C++ STL容器适配器之priority_queue

queue的使用






































函数名称 接口说明
queue() 构造空的队列
empty() 检测队列是否为空,是返回true,否则返回false
size() 返回队列中有效元素的个数
back() 返回队尾元素的引用
front() 返回队头元素的引用
push() 在队尾将元素val入队列
pop() 将队头元素出队列

queue的模拟实现

myqueue.h

  1. #pragma once
  2. #include<deque>
  3. using namespace std;
  4. template<class T, class Con = deque<T>>
  5. class myqueue {
  6. Con qu;
  7. public:
  8. myqueue() {
  9. }
  10. void push(const T& val) {
  11. qu.push_back(val);
  12. }
  13. void pop() {
  14. qu.pop_front();
  15. }
  16. T& front() {
  17. return qu.front();
  18. }
  19. T& back() {
  20. return qu.back();
  21. }
  22. int size() {
  23. return qu.size();
  24. }
  25. bool empty() {
  26. return qu.empty();
  27. }
  28. };

测试入口main.cpp

  1. #include<iostream>
  2. #include<deque>
  3. #include<queue>
  4. #include<list>
  5. #include"myqueue.h"
  6. using namespace std;
  7. void Test_queue() {
  8. cout << "STL中的queue\n";
  9. queue<int, deque<int>> qu;
  10. for (int i = 1; i <= 5; ++i) {
  11. qu.push(i);
  12. }
  13. cout << "size = " << qu.size() << endl;
  14. cout << qu.back() << endl;
  15. while (!qu.empty()) {
  16. cout << qu.front() << endl;
  17. qu.pop();
  18. }
  19. cout << "size = " << qu.size() << endl;
  20. }
  21. void Test_myqueue() {
  22. cout << "自己实现的的queue\n";
  23. myqueue<int> qu;
  24. //myqueue<int, list<int>> qu;
  25. for (int i = 1; i <= 5; ++i) {
  26. qu.push(i);
  27. }
  28. cout << "size = " << qu.size() << endl;
  29. cout << qu.back() << endl;
  30. while (!qu.empty()) {
  31. cout << qu.front() << endl;
  32. qu.pop();
  33. }
  34. cout << "size = " << qu.size() << endl;
  35. }
  36. int main() {
  37. Test_queue();
  38. Test_myqueue();
  39. system("pause");
  40. return 0;
  41. }

运行结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,48人围观)

还没有评论,来说两句吧...

相关阅读

    相关 518-C++STL(容器适配器)

    C++STL(容器适配器) 标准容器 - 容器适配器 => 我们有一种设计模式,就叫做适配器模式 stack容器适配器相当于就是栈把deque代理了一下 怎么理解这个