C++ で STL スタックコンテナを使用する
-
C++ で
std::stackを使用してスタックコンテナオブジェクトを宣言する -
C++ で
top()関数を使用して最近追加された要素にアクセスする -
C++ で
swap()関数を使用して 2つのスタックの内容を交換する
この記事では、C++ で STL スタックコンテナを使用する方法に関する複数の方法を示します。
C++ で std::stack を使用してスタックコンテナオブジェクトを宣言する
std::stack はコンテナアダプタと呼ばれ、標準コンテナのラッパーとして機能できますが、限定された特殊な機能を提供します。例として、std::stack クラスは LIFO(last-in、firs-out)データ構造を提供し、その下の std::vector または std::deque コンテナーにマップできます。std::stack は、別の stack オブジェクトまたは deque、vector、list などの互換性のあるシーケンスコンテナで初期化できます。ただし、stack 要素を格納するために使用されるデフォルトのコンテナは deque であることに注意してください。また、初期化子リストまたは要素を直接渡すことをサポートするコンストラクターはありません。stack オブジェクトが宣言されたら、push メソッドを使用する必要があります。
stack オブジェクトは、範囲ベースのループを使用して繰り返すことができないことに注意してください。したがって、特別な while ループを実装して、各要素を cout ストリームに出力します。printStack 関数は stack 引数を取りますが、vector オブジェクトによって初期化された st1 は、これら 2つのオブジェクトのタイプが異なり、コンパイラがエラーをスローするため、渡すことができません。
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main() {
vector<int> vec1 = {1, 2, 3, 4, 11};
stack st1{vec1};
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// printStack(st1); Error - no matching function
printStack(st2);
return EXIT_SUCCESS;
}
C++ で top() 関数を使用して最近追加された要素にアクセスする
top() 関数は、スタックの最上位の要素を返すメンバー関数です。この関数は、返された要素を stack オブジェクトから自動的に削除しないことに注意してください。pop メンバー関数を呼び出して削除する必要があります。
#include <iostream>
#include <stack>
using std::cout;
using std::endl;
using std::stack;
int main() {
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
cout << "top of the stack st2: ";
cout << st2.top() << endl;
return EXIT_SUCCESS;
}
出力:
top of the stack st2: 120
C++ で swap() 関数を使用して 2つのスタックの内容を交換する
swap() 関数は、stack コンテナのメンバー関数です。stack オブジェクトへの参照を取り、これらのスタックから要素を交換します。vector オブジェクトを使用して初期化される st1 オブジェクトは、swap 関数を呼び出すことも、その引数にすることもできないことに注意してください。コンテナで初期化された stack を swap 関数で使用できるようにするには、st3 オブジェクトが次のコード例で初期化されるため、std::move 呼び出しを使用して作成する必要があります。後者も問題なく printStack 関数に渡すことができます。最後に、st2/st3 スタックオブジェクトの要素を交換し、結果をコンソールに出力します。
#include <deque>
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::deque;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main() {
deque<int> deq1 = {11, 12, 13, 14};
vector<int> vec1 = {1, 2, 3, 4, 11};
stack st1{vec1};
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// st2.swap(st1); Error
stack<int> st3{std::move(deq1)};
printStack(st2);
printStack(st3);
st2.swap(st3);
printStack(st2);
printStack(st3);
return EXIT_SUCCESS;
}
出力:
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
14; 13; 12; 11;
14; 13; 12; 11;
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
