限制stl堆栈对象的大小

时间:2012-12-01 20:33:10

标签: c++ stl stack

std::stack的尺寸是否有限制?

我使用std::stack<std::pair<int,std::string>>作为我的堆栈,当条目数超过大约100万时,我收到运行时错误。

这是由于std::stack的大小限制吗?

2 个答案:

答案 0 :(得分:5)

std::stack是容器适配器。它只是一个其他容器的前端,使它看起来像一个堆栈。如果您将名称std::vector替换为push且名称push_back替换为pop,请考虑将pop_back视为堆栈。因此,任何大小限制或类似限制都将是后备容器的结果,而不是std::stack

std::stack的默认支持容器为std::dequeN3376 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)。 默认底层容器为usingstd::dequestd::dequestd::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<>