a 的大小有限制std::stack吗?
我使用 astd::stack<std::pair<int,std::string>>作为我的堆栈,当条目数超过大约 100 万时,我收到运行时错误。
这是由于大小的限制std::stack吗?
std::stack是一个容器适配器。它只是其他一些容器的正面,使它看起来像一个堆栈。考虑一下,如果您将名称替换为并将名称替换为 ,std::vector则可以将其视为堆栈。因此,任何大小限制或类似限制都将是支持容器的结果,而不是.pushpush_backpoppop_backstd::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<std::deque<t>::size_type>::max().
但是,您更有可能遇到机器内存限制,或者在应用程序的其他地方有一些错误导致运行时错误。
std::stack容器适配器的底层容器放置在protected部分中,可以按名称访问 (通过完全限定名称从派生类或通过使用derectivec引入类名称空间)。using默认基础容器是std::deque. std::deque,std::list或std::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;
}