C++——stack|queque|容器适配器 栈的实现 queque实现 dequequedequeque的缺陷 优先级队列习题 优先级队列模拟实现 仿函数(一)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 笔记

容器适配器


20.png

我们可以看出,栈中没有空间配置器(内存池),而是适配器


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

21.png22.png23.png

栈的实现


#include<vector>
#include<iostream>
using namespace std;
namespace myspace
{
  template<class T>
  class Stack
  {
  public:
  void push(const T& x)
  {
    _con.push_back(x);
  }
  void pop()
  {
    _con.pop_back();
  }
  T& top()
  {
    return _con.back();//back接口访问尾部的数据
  }
  T& top()const
  {
    return _con.back();//back接口访问尾部的数据
  }
  bool empty()
  {
    return _con.empty();
  }
  size_t size()const
  {
    return _con.size();
  }
  private:
  vector<T> _con;
  };
}

此时这个栈并不是适配器,因为底层被写死了,底层是用vector实现的,如果想让它适配,加上适配器即可


此时就是适配器

24.png25.png

list

26.png



注意队列不能用vector,编译会报错,因为不支持头删,没有pop_front


queque实现

namespace myspace
{
  template<class T, class Container = deque<T>>
  class queue
  {
  public:
  void push(const T& x)
  {
    _con.push_back(x);
  }
  void pop()
  {
    _con.pop_front();
  }
  T& back()
  {
    return _con.back();
  }
  T& front()
  {
    return _con.front();
  }
  const T& back() const
  {
    return _con.back();
  }
  const T& front() const
  {
    return _con.front();
  }
  bool empty()  const
  {
    return _con.empty();
  }
  size_t size() const
  {
    return _con.size();
  }
  private:
  Container _con;
  };
}

dequeque


2.png27.png


我们发现栈和队列都有一个dequeque


dequeque不是队列,是vector和list的结合体


1.支持任意位置的插入删除


2.支持随机访问

3.png4.png

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

5.png



双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:

6.png7.png

dequeque的缺陷

vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。



与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。



但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下(中间的插入删除效率很低),


而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构


测试之后,dequeque显然效率低8.png

void test_op()
{
  srand(time(0));
  const int N = 100000;
  vector<int> v;
  v.reserve(N);
  deque<int> dp;
  for (int i = 0; i < N; ++i)
  {
  auto e = rand();
  v.push_back(e);
  dp.push_back(e);
  }
  int begin1 = clock();
  sort(v.begin(), v.end());
相关文章
|
2月前
|
设计模式 C++ 容器
c++中的Stack与Queue
c++中的Stack与Queue
|
3月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
91 21
|
6月前
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
91 1
|
6月前
|
设计模式 存储 C++
C++之stack 和 queue(下)
C++之stack 和 queue(下)
91 1
|
6月前
|
C++ 容器
C++之stack 和 queue(上)
C++之stack 和 queue(上)
149 0
|
6月前
|
存储 C++ 容器
C++番外篇——stack、queue的实现及deque的介绍
C++番外篇——stack、queue的实现及deque的介绍
51 0
|
6月前
|
存储 算法 C++
C++入门10——stack与queue的使用
C++入门10——stack与queue的使用
77 0
|
6月前
|
设计模式 存储 C++
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现(二)
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现
|
6月前
|
存储 C++ 容器
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现(一)
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现
|
26天前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
84 16