【发布时间】:2019-10-08 14:06:26
【问题描述】:
根据std::stack参考:
用于存储元素的底层容器的类型。 容器必须满足 SequenceContainer 的要求。 此外,它必须提供以下功能与通常的 语义:
back() push_back() pop_back()标准容器 std::vector、std::deque 和 std::list 满足 这些要求。默认情况下,如果没有指定容器类 特定的堆栈类实例化,标准容器 使用 std::deque。
所有这些都是基于堆的容器。
以下实际编译(clang):
std::stack<int, std::array<int, 12> > stack_of_months;
直到push 被调用。
是否有一些技巧可以轻松包装 std::array 以支持这些方法,以便可以在堆栈中使用它?
【问题讨论】:
-
否,因为它不支持
push函数。vector怎么了? -
好的,假设您可以使用
std::array来执行此操作。如果你在一个完整的堆栈上调用push会发生什么?抛出异常,底部元素被移除等? -
@ChrisMM 向量没有什么问题——我喜欢向量——但假设你需要一个有限的基于堆栈的堆栈
-
将数据存储在“堆栈上”的对象在 C++ 中是隐式固定大小的。
std::array不能增长或缩小。如果您知道需要容纳的最大大小或愿意任意设置一个,您也许可以实现自己的容器。但是在堆栈上存储大量数据通常是不明智的,这是一种有限的资源。这样做很容易耗尽堆栈空间,而且无法恢复。 -
@darune 也许将
std::vector与基于堆栈的分配器一起使用可能对您有用。但是考虑一下我之前关于在堆栈上存储大数据的警告。