●C++編(標準ライブラリ) 第5章 stack

○stackクラス

STLの各コンテナを、用途に合わせて特殊化できます。その1つの形がstackクラス です。スタックについては、アルゴリズムとデータ構造編第8章を参照して 下さい。また、stackのように、コンテナを特殊化して使用するものをコンテナアダプタ と呼びます。

stackクラスは、メンバ変数として何らかのコンテナクラスを持っています。このコンテナの種類は、stackクラスを インスタンス化するときに指定できるようになっているので、どのコンテナを使うかが選択できます。デフォルトでは、 dequeが使われることになっていて、ほとんどの場合、それで問題はありません。他のコンテナを使える訳ですが、 スタックというデータ構造の都合上、末尾の要素にアクセスできるコンテナしか利用できません。例えば、push_back()、 pop_back()、back()といったメンバ関数を持っているコンテナである必要があります。

○使い方

使い方は非常に簡単です。

#include <stack>
#include <iostream>

int main()
{
	using namespace std;

	stack<int> st;    // int型のスタック

	// 要素のプッシュとポップ
	st.push( 10 );
	st.push( 20 );
	cout << st.top() << "をポップします" << endl;
	st.pop();

	return 0;
}

stackクラスをインスタンス化するとき、格納するデータ型を指定します。コンストラクタにより、スタックは空の 状態に初期化されます。もし、deque以外のコンテナを使いたければ、

stack<int, vector<int> > st;

のようにして、スタックを生成します。2つの>の間にスペースが必要なことに注意して下さい。スペースが ないと、優先順位の関係上、シフト演算子として扱われてしまいます。

スタックに要素をプッシュするにはpush()、ポップするには pop()を呼び出します。pop()は、要素をスタックから取り出しますが、戻り値として それを返すことはしません。何を取り出したのか知りたいときは、pop()する直前で、top() を呼び出します。top()は、次にポップされる値が何であるかを返しますが、実際に取り出すことはしません。pop()と top()の使い分けには注意が必要でしょう。

注意点として、pop()やtop()は、スタックが空のときに呼び出したときどうなるかが定義されていません。例外が スローされる訳でもありません。そのため、空のときにこれらのメンバ関数を呼び出してはなりません。そのため、 確実に空でない状態で呼び出せることが保証できないときは、事前にempty()メンバ 関数を使って、空かどうか確認する必要があります。

スタックに含まれている要素数はsize()で取得できます。空かどうかの判定は empty()の方が効率的です。

また、==、!=、<、<=、>、>=の各演算子がオーバーロードされています。==演算子は、2つのstack を比較したとき、含まれている要素が、全く同じ順番で並んでいるときにだけ真となります。不等号の演算子は、辞書順 で比較します。


C++編(標準ライブラリ)のトップページに戻る

サイトのトップページに戻る

1