4

a 的大小有限制std::stack吗?

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

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

4

2 回答 2

5

std::stack是一个容器适配器。它只是其他一些容器的正面,使它看起来像一个堆栈。考虑一下,如果您将名称替换为并将名称替换为 ,std::vector则可以将其视为堆栈。因此,任何大小限制或类似限制都将是支持容器的结果,而不是.pushpush_backpoppop_backstd::stack

的默认支持容器std::stackstd::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().

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

于 2012-12-01T20:37:37.340 回答
0

std::stack容器适配器的底层容器放置在protected部分中,可以按名称访问 (通过完全限定名称从派生类或通过使用derectivec引入类名称空间)。using默认基础容器是std::deque. std::deque,std::liststd::vector. 它们都提供max_size()成员函数,返回可分配的最大大小。 上述容器的权威来源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;
}
于 2015-10-02T08:26:00.470 回答