のサイズに制限はありますstd::stack
か?
スタックとしてを使用しstd::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
コンテナアダプタの基になるコンテナ(完全修飾名を使用して派生クラスから、またはderectiveを使用してクラス名前空間に導入することにより)。デフォルトの基になるコンテナはです。、または。それらはすべてメンバー関数を提供し、まだ割り当てることができる最大サイズを返します。
言及されたコンテナの信頼できるソースWRTメンバー機能は次のように述べています。protected
c
using
std::deque
std::deque
std::list
std::vector
max_size()
max_size()
ノート
この値は通常、std :: neuro_limits :: max()と等しく、コンテナのサイズの理論上の制限を反映しています。実行時に、コンテナのサイズは、使用可能なRAMの量だけmax_size()よりも小さい値に制限される場合があります。
したがって、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;
}