std::stack
的尺寸是否有限制?
我使用std::stack<std::pair<int,std::string>>
作为我的堆栈,当条目数超过大约100万时,我收到运行时错误。
这是由于std::stack
的大小限制吗?
答案 0 :(得分:5)
std::stack
是容器适配器。它只是一个其他容器的前端,使它看起来像一个堆栈。如果您将名称std::vector
替换为push
且名称push_back
替换为pop
,请考虑将pop_back
视为堆栈。因此,任何大小限制或类似限制都将是后备容器的结果,而不是std::stack
。
std::stack
的默认支持容器为std::deque
(N3376 23.6.5.2 [stack.defn]
)。该标准要求std::deque
提供max_size
成员函数(N3376 23.3.3.1 [deque.overview]/2
),它会告诉您std::deque
根据实施限制可以容纳的最大元素数。这通常类似于std::numeric_limits<std::deque<t>::size_type>::max()
。
但是,您更有可能遇到机器内存限制,或者在应用程序的其他地方出现一些错误导致运行时错误。
答案 1 :(得分:0)
放置在std::stack
部分和can be accessed by name protected
中的c
容器适配器的底层容器(通过完全合格的名称或通过使用{引入类命名空间来源派生类) {1}} derective)。
默认底层容器为using
。 std::deque
,std::deque
或std::list
。所有这些都提供std::vector
成员函数,返回可用的最大大小。
上述容器的Authoritative source WRT max_size()
成员函数说:
备注强>
此值通常等于std :: numeric_limits :: max(),并反映容器大小的理论限制。在运行时,容器的大小可能被限制为小于max_size()的值可用的RAM量。
因此,max_size()
的智能实现的返回值可以依赖于RAM可用于分配。
要访问max_size()
,应该编写一个派生自std::stack<>::c.max_size()
类的内容,如下所示:
std::stack<>