STL--stack、queue实现

简介: STL--stack、queue实现

STL中,vector、list 是容器,自己存储一系列的数据进行增删查改,而 stack、queue 是一种特殊的容器,叫容器适配器,提供一种特定的接口来访问底层容器。

STL--stack实现

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

STL--queue实现

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

stack可以使用 vector、list、deque 来适配;queue只能通过 list、deque来适配,因为 queue 的 pop相当于是头删,vector中没有头删这个功能!

容器适配器默认参数 deque

deque叫双端队列,但它不是队列,它的意思是进行头部和尾部插入、删除比较方便。

deque的内部是由多个 buff 子数组和一个中控指针数组,当中控数组满了之后才需要扩容,并且扩容的代价极低(新开空间后,只需要拷贝指针即可)

虽然 deque 也可以进行任意位置的插入和删除,但效率却不是很高。

中间插入删除:当每个 buff数组 一样大,需要整体挪动数据,中间插入删除效率低,但下标的随机访问 [ ] 快很多!因为 当每个buff 数组一样大时,可以直接计算出数据的下标;当每个 buff 数组不一样大时,中间插入删除不需要整体挪动数据,只需要对buff 单独操作即可,但下标的计算将会困难很多!

相关文章
|
JavaScript
Vue 使用 mockjs (返回数据、get、post 请求)
Vue 使用 mockjs (返回数据、get、post 请求)
530 0
|
消息中间件 Ubuntu Java
在Ubuntu 18.04上安装Apache Kafka的方法
在Ubuntu 18.04上安装Apache Kafka的方法
404 0
|
存储 算法 编译器
【STL】vector的底层原理及其实现
【STL】vector的底层原理及其实现
|
存储 缓存 算法
【Cmake 增加编译参数 】cmake增加编译参数和预处理指令的几种方法
【Cmake 增加编译参数 】cmake增加编译参数和预处理指令的几种方法
675 1
|
算法 编译器 C++
【C++ 关键字的混合使用 】C++深度探索:auto、static、constexpr的交互影响与应用
【C++ 关键字的混合使用 】C++深度探索:auto、static、constexpr的交互影响与应用
296 0
|
消息中间件 分布式计算 Hadoop
实时计算 Flink版操作报错合集之使用flink jar开发,报错:找不到main方法,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
前端开发 JavaScript CDN
一文搞懂:免费观看全网VIP视频资源
一文搞懂:免费观看全网VIP视频资源
1900 0
|
存储 安全 算法
【C/C++ std::memory_order 枚举】掌握 C++ 内存模型:深入理解 std::memory_order 的原理与应用
【C/C++ std::memory_order 枚举】掌握 C++ 内存模型:深入理解 std::memory_order 的原理与应用
890 0
|
并行计算
ArcMap的Split Raster工具无法生成结果图像是怎么回事?
本文介绍在ArcMap软件中,进行分割栅格(Split Raster)工具处理后,得不到结果文件的解决方法~
246 1
ArcMap的Split Raster工具无法生成结果图像是怎么回事?
|
NoSQL Linux
Linux系统调试篇——核心转储(core dump)
Linux系统调试篇——核心转储(core dump)