2012-12-01 125 views
4

std::stack的大小是否有限制?stl堆栈对象的大小限制

我使用的是std::stack<std::pair<int,std::string>>作为我的筹码,而当条目数超过约1万元,我得到一个运行时错误。

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

+1

有很多的运行时错误的可能原因。发布您的代码。 – NPE

+0

@erosenin:它看起来更像是你的堆栈分配'长'缓冲区是原因;特别是考虑到你给它一百万的大小。自动存储(“堆栈”)的典型实现限制是1MB(Windows)至8MB(Linux,大多数Unix)。假设这个平台上的“long”是8个字节,那么100万* 8个字节= 8MB,这在大多数Unix上都会受到限制。在自动存储中使用动态内存分配而不是数组。 –

回答

5

std::stack是一个容器适配器。它仅仅是一些其他容器的前端,使它看起来像一个堆栈。考虑到std::vector可以像一个堆栈进行治疗,如果您有push_back和名字poppop_back替换名称push。因此,任何尺寸限制或类似将是支撑容器的结果,而不是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()

然而,更有可能的是,你要么运行到机器内存的限制,还是有一些bug在你的应用程序的其他地方造成运行时错误。

+0

是的,我用随机输入检查我得到一个SIGXFSZ错误,所以它是导致错误的文件大小限制http://ideone.com/0McrLi – mohit

0

标的放置在protected部和std::stack容器适配器的容器can be accessed by namec(从派生类通过全qualificated名的手段或通过引入到使用using derective类命名空间)。 默认的基础容器是std::dequestd::dequestd::liststd::vector。它们都提供了max_size()成员函数,返回最大大小可用于分配。 Authoritative source WRT max_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; 
}