C++ STL の は、基になるコンテナーのイテレーターを公開していますか、std::stack
それともそのコンテナーを直接使用する必要がありますか?
35122 次
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::deque
push_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 に答える