C++ で STL スタックコンテナを使用する

胡金庫 2023年10月12日
  1. C++ で std::stack を使用してスタックコンテナオブジェクトを宣言する
  2. C++ で top() 関数を使用して最近追加された要素にアクセスする
  3. C++ で swap() 関数を使用して 2つのスタックの内容を交換する
C++ で STL スタックコンテナを使用する

この記事では、C++ で STL スタックコンテナを使用する方法に関する複数の方法を示します。

C++ で std::stack を使用してスタックコンテナオブジェクトを宣言する

std::stack はコンテナアダプタと呼ばれ、標準コンテナのラッパーとして機能できますが、限定された特殊な機能を提供します。例として、std::stack クラスは LIFO(last-in、firs-out)データ構造を提供し、その下の std::vector または std::deque コンテナーにマップできます。std::stack は、別の stack オブジェクトまたは dequevectorlist などの互換性のあるシーケンスコンテナで初期化できます。ただし、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 関数を呼び出すことも、その引数にすることもできないことに注意してください。コンテナで初期化された stackswap 関数で使用できるようにするには、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;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook