93901


データ構造（スタックやキューについて）競技プログラミングの観点と実務という観点にてお聞きしたいことがあります。  
C++等ではスタックやキューは標準ライブラリに入ってるとおもわれるのですが、このクラスを自分で拡張したりすることはあるのでしょうか？？


CC BY-SA 4.0
2023-02-16T15:31:20.383
93877
2023-02-18T07:34:53.990
56641
question
c++ データ構造
データ構造（スタックやキューについて）


> C++等ではスタックやキューは標準ライブラリに入ってるとおもわれるのですが、このクラスを自分で拡張したりすることはあるのでしょうか？？

なにを聞きたいのかイマイチわかりませんが、あるかないかを聞かれれば、ある、ということになろうかと。


CC BY-SA 4.0
2023-02-17T04:38:42.500
93885
2023-02-17T04:38:42.500
27481
93877
answer


> スタックやキューは標準ライブラリに入ってるとおもわれるのですが、このクラスを自分で拡張したりすることはあるのでしょうか？？

技術的には、拡張可能です。

C++標準ライブラリが提供する[`std::stack`](https://cpprefjp.github.io/reference/stack/stack.html)(LIFOデータ構造)と[`std::queue`](https://cpprefjp.github.io/reference/queue/queue.html)(FIFOデータ構造)は、要素値のデータ格納機構を外部に委ねるコンテナアダプタ(Container
Adapter)となっています。このためクラステンプレート設計上は、プログラマによる拡張がある程度考慮されています。

両コンテナアダプタ共に、第2テンプレート引数にて具体的なデータ格納機構（コンテナ）を指定できます。省略時のデフォルトパラメータでは[`std::deque`](https://cpprefjp.github.io/reference/deque/deque.html)コンテナが利用されます。

[code]

    // std::deque<int>を利用したスタック
    std::stack<int> s0;
    // std::deque<int>を利用したキュー
    std::queue<int> q0;
    
    // std::vector<int>を利用したスタック
    std::stack<int, std::vector<int>> s1;
    // std::list<int>を利用したキュー
    std::queue<int, std::list<int>> q1;
    
[/code]

また両コンテナアダプタ共に、その内部でデータ格納に利用するコンテナを保持しており、そのメンバ変数`c`をprotectedアクセスとして派生先クラスへと公開しています。つまり`std::stack`や`std::queue`クラスから継承した独自クラスを作成し、通常のスタック／キューにはない特別な操作を行うメンバ関数を追加することもできます。


CC BY-SA 4.0
2023-02-18T07:34:53.990
93901
2023-02-18T07:34:53.990
49
93877
answer