【问题标题】:How is Stack implemented in STL?STL 中的 Stack 是如何实现的?
【发布时间】:2023-03-09 08:05:01
【问题描述】:

我遇到了这个:

Standard C++ Containers

这引发了我的问题,STL 中的堆栈是如何实现的?

我正在寻找类似的描述:

How is C++ std::vector implemented?

What really is a deque in STL?

【问题讨论】:

  • 您提供的链接中对stack 适配器的描述中的什么引起了混淆?关于该适配器can be found here 的替代文档,我强烈建议您为该站点添加书签。它作为 C++ 参考非常出色,是最好的恕我直言之一。

标签: c++ stl stack implementation


【解决方案1】:

std::stack有一个模板参数Container,要求是可以存储T类型元素的容器(也就是栈元素的类型)。这个容器需要有back()push_back()pop_back()函数,标准容器vectordequelist都满足要求。

因此,无论用户指定哪种容器类型,std::stack 的最终实例化都是一个类:

  • 有一个 Container<T> 类型的数据成员(或者非常相似的东西,如果不是字面上的数据成员。我想它可能是一个私有基类)。
  • 每当您在堆栈上调用 push() 时,都会在容器上调用 push_back()
  • 每当您在堆栈上调用pop() 时,都会在容器上调用pop_back()
  • 等等。

简单地说,std::stack<T> 是一个封装了std::deque<T> 实例的对象,并隐藏了deque 的大部分功能,以便提供一个更简单的界面用作后进先出 (LIFO) 队列。类似地,std::queue 提供了一个 FIFO 队列。

【讨论】:

    【解决方案2】:

    stack是一个适配器,它使用另一个容器进行底层存储,并将pushpopemplace等函数链接到底层容器中的相关函数。

    默认情况下,std::stack 使用 std::deque 作为底层容器。但是您可以指定自己的,例如std::stack<T, std::vector<T>> s;.

    有关此的更多详细信息,请参阅cppreference

    【讨论】:

      猜你喜欢
      • 2019-10-12
      • 2016-06-11
      • 2011-04-18
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 2019-06-01
      • 2011-05-12
      相关资源
      最近更新 更多