38

C++ STL の は、基になるコンテナーのイテレーターを公開していますか、std::stackそれともそのコンテナーを直接使用する必要がありますか?

4

5 に答える 5

43

スタックの定義により、スタックには反復子がありません。イテレータとのスタックが必要な場合は、他のコンテナ (std::list、std::vector など) の上に自分で実装する必要があります。 スタック ドキュメントはこちらです。

PS Iraimbilanja から得たコメントによると、 std::stack はデフォルトで実装に std::deque を使用します。

于 2009-02-08T08:02:06.357 に答える
14

イテレータを含むスタックが必要な場合は、次の 2 つの選択肢があります。

  • std::vectorを使用してpush_back()pop_back()

  • std::dequepush_back()/または/をpop_back()使用します。push_front()pop_front()

于 2009-02-08T18:01:10.767 に答える
7

は、保護されたインターフェイスを介して、std::stackその基になるコンテナー (したがってイテレーター) をサブクラスに公開します。std::stack基になるコンテナー オブジェクトは、(保護された) データ メンバー に対応しますc。したがって、それらにアクセスしたい場合はstd::stack、少し拡張できます。

template<typename T, typename Container = std::deque<T>>
class iterable_stack
: public std::stack<T, Container>
{
    using std::stack<T, Container>::c;

public:

    // expose just the iterators of the underlying container
    auto begin() { return std::begin(c); }
    auto end() { return std::end(c); }

    auto begin() const { return std::begin(c); }
    auto end() const { return std::end(c); }
};

int main()
{
    iterable_stack<int> st;

    st.push(2);
    st.push(5);
    st.push(3);
    st.push(7);
    st.push(9);

    for(auto i: st)
        std::cout << i << ' ';
    std::cout << '\n';
}

出力:

2 5 3 7 9 
于 2018-02-27T05:43:23.850 に答える
2

SGIMSDN、およびGNUのドキュメントではstack、イテレータは提供されていません。

于 2009-02-08T08:01:08.917 に答える