4

のサイズに制限はありますstd::stackか?

スタックとしてを使用しstd::stack<std::pair<int,std::string>>ていますが、エントリ数が約100万を超えると、ランタイムエラーが発生します。

これはサイズの制限によるものstd::stackですか?

4

2 に答える 2

5

std::stackコンテナアダプタです。これは、他のコンテナの前面にすぎず、スタックのように見えます。名前をに、名前を。std::vectorに置き換えると、スタックのように扱うことができると考えてください。したがって、サイズ制限などは、ではなく、バッキングコンテナの結果になります。pushpush_backpoppop_backstd::stack

のデフォルトのバッキングコンテナstd::stackstd::dequeN3376 23.6.5.2 [stack.defn])です。この標準では、メンバー関数( )をstd::deque提供する必要があります。これは、実装の制限に従って保持できる要素の最大数を示します。これは通常、のようなものになります。max_sizeN3376 23.3.3.1 [deque.overview]/2std::dequestd::numeric_limits<std::deque<t>::size_type>::max()

ただし、マシンのメモリ制限に達しているか、アプリケーションの他の場所にバグがあり、ランタイムエラーが発生している可能性があります。

于 2012-12-01T20:37:37.340 に答える
0

セクションに配置され、名前でアクセスできるstd::stackコンテナアダプタの基になるコンテナ(完全修飾名を使用して派生クラスから、またはderectiveを使用してクラス名前空間に導入することにより)。デフォルトの基になるコンテナはです。、または。それらはすべてメンバー関数を提供し、まだ割り当てることができる最大サイズを返します。 言及されたコンテナの信頼できるソースWRTメンバー機能は次のように述べています。protected cusingstd::dequestd::dequestd::liststd::vectormax_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;
}
于 2015-10-02T08:26:00.470 に答える