C++ で STL スタックコンテナを使用する
-
C++ で
std::stack
を使用してスタックコンテナオブジェクトを宣言する -
C++ で
top()
関数を使用して最近追加された要素にアクセスする -
C++ で
swap()
関数を使用して 2つのスタックの内容を交換する
![C++ で STL スタックコンテナを使用する](/img/Cpp/feature-image---stack-in-cpp.webp)
この記事では、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;