2012-12-01 163 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; 
}