a 的大小有限制std::stack
吗?
我使用 astd::stack<std::pair<int,std::string>>
作为我的堆栈,当条目数超过大约 100 万时,我收到运行时错误。
这是由于大小的限制std::stack
吗?
std::stack
是一个容器适配器。它只是其他一些容器的正面,使它看起来像一个堆栈。考虑一下,如果您将名称替换为并将名称替换为 ,std::vector
则可以将其视为堆栈。因此,任何大小限制或类似限制都将是支持容器的结果,而不是.push
push_back
pop
pop_back
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<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;
}