【问题标题】:Limit on size of stl stack objectstl 堆栈对象的大小限制
【发布时间】:2012-11-19 18:02:41
【问题描述】:

std::stack 的大小是否有限制?

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

这是因为std::stack的大小限制吗?

【问题讨论】:

  • 运行时错误有很多可能的原因。发布您的代码。
  • @erosenin:看起来更像是您分配的堆栈long 缓冲区是原因;特别是考虑到你给它的大小是一百万。自动存储(“堆栈”)的典型实现限制在 1MB(Windows)到 8MB(Linux,大多数 Unix)的范围内。假设long 在这个平台上是 8 字节,100 万 * 8 字节 = 8MB,这几乎超过了大多数 Unix 的限制。在自动存储中使用动态内存分配而不是数组。

标签: c++ stl stack


【解决方案1】:

std::stack 容器适配器的基础容器放置在 protected 部分和 can be accessed by name c 中(通过完整限定名称或通过使用 using derective 引入类命名空间的派生类)。 默认底层容器是std::dequestd::dequestd::liststd::vector。它们都提供max_size() 成员函数,返回可分配的最大大小。 Authoritative sourceWRTmax_size()上述容器的成员函数说:

备注

该值通常等于 std::numeric_limits::max(),反映了容器大小的理论限制。在运行时,容器的大小可能会被限制为小于 max_size() 可用 RAM 量的值。

因此,max_size() 的智能实现的返回值可以依赖于可分配的 RAM。

要访问std::stack<>::c.max_size(),应该编写一个从std::stack<> 派生的类,如下所示:

#include <iostream>
#include <stack>

#include <cstdlib>


template< typename type >
struct my_stack
    : std::stack< type >
{

    using base = std::stack< type >;
    using base::base;
    using base::operator =;

    std::size_t
    max_size() const
    {
        return base::c.max_size();
    }

};

int
main()
{
    my_stack< int > s;
    std::cout << s.max_size() << std::endl;
    return EXIT_SUCCESS;
}

【讨论】:

    【解决方案2】:

    std::stack 是一个容器适配器。它只是其他一些容器的正面,使它看起来像一个堆栈。考虑如果将名称 push 替换为 push_back 并将名称 pop 替换为 pop_back,则 std::vector 可以被视为堆栈。因此,任何大小限制或类似情况都将是后备容器的结果,而不是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&lt;std::deque&lt;t&gt;::size_type&gt;::max()

    但是,您更有可能遇到机器内存限制,或者您的应用程序的其他地方有一些错误导致运行时错误。

    【讨论】:

    • 是的,我检查了随机输入我得到了一个 SIGXFSZ 错误,所以是文件大小限制导致了错误ideone.com/0McrLi
    猜你喜欢
    • 2013-09-26
    • 2023-04-10
    • 2018-02-08
    • 2018-10-16
    • 2022-07-21
    • 2011-10-02
    • 2021-05-08
    • 2016-06-27
    相关资源
    最近更新 更多