コンテナアダプター
アダプターとは
アダプターは設計パターン(設計パターンは繰り返し使用されるセットであり、ほとんどの人は知っている、分類されたカタログ、コード設計経験の要約)であり、パターンはクラスインターフェースを顧客が望む別のインターフェースに変換する。
スタック、キュー、priority_queueがコンテナーアダプターと呼ばれる理由
stack、queue、priority_queueにも要素を格納できますが、STLではコンテナのランクに分けられていませんが、各コンテナの下部に独自の実装があるため、コンテナアダプタと呼ばれています。そして、stack、queue、priority_queueは、以下のような他のコンテナを下部にカプセル化します。
シミュレーション実装スタック、キュー、priority_queue
コード例:
namespace bit
{
#include<deque>
template<class T, class Con = deque<T>>
class stack
{
public:
stack()
{}
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_back();
}
T& top()
{
return _c.back();
}
const T& top()const
{
return _c.back();
}
size_t size()const
{
return _c.size();
}
bool empty()const
{
return _c.empty();
}
private:
Con _c;
};
}
namespace bit {
#include<deque>
template<class T, class Con = deque<T>>
class queue
{
public:
queue()
{}
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_front();
}
T& back()
{
return _c.back();
}
const T& back()const
{
return _c.back();
}
T& front()
{
return _c.front();
}
const T& front()const
{
return _c.front();
}
size_t size()const
{
return _c.size();
}
bool empty()const
{
return _c.empty();
}
private:
Con _c;
};
}
namespace bit
{
template <class T, class Sequence = vector<T>, class Compare = less<T> >
class priority_queue
{
public:
priority_queue() : c()
{}
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last)
: c(first, last)
{
make_heap(c.begin(), c.end(), comp);
}
bool empty() const
{
return c.empty();
}
size_t size() const
{
return c.size();
}
T& top() const
{
return c.front();
}
void push(const T & x)
{
c.push_back(x);
push_heap(c.begin(), c.end(), comp);
}
void pop() {
pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}
private:
Sequence c;
Compare comp;
};
}
スタックとキューの下部のデフォルトコンテナーとしてdequeを選択する理由
スタックは後入れ先出しの特別な線形データ構造です。これは、push_back()およびpop_back()操作を含む線形構造がスタックの最下部のコンテナーとして使用できる限り(ベクトルやリストなど)、キューは先入れ先出し特別です線形データ構造は、線形構造にpush_backおよびpop_front操作がある限り、リストなどのキューの基になるコンテナーとして使用できます。ただし、STLでは、主に次の理由により、デフォルトでスタックとキューの基になるコンテナーとしてdequeが選択されています。
- スタックとキューをトラバースする必要はありません(したがって、スタックとキューにはイテレーターがありません)。固定端または両端でのみ動作する必要があります。
- スタック内の要素が大きくなると、両端キューはベクトルよりも効率的になり、キュー内の要素が大きくなると、両端両端キューは効率的であるだけでなく、メモリ使用量も多くなります。
文をまとめると、両端の両端が最速で成長し、削除されます。
主なポイントの要約:
スタック | キュー | |
---|---|---|
デフォルトのアダプター | と | と |
オプションのアダプター | ベクトル、リスト | リスト |
作動する必要があります | push => push_back、pop => pop_back、top =>戻る | push => push_back、pop => pop_front、back => back、front => front |
priority_queue:
#include(模倣関数)
デフォルトのアダプター:ベクトルの
デフォルトの比較方法:少ない
オプションのアダプター:deque
オプションの比較方法:大きい
#include(アルゴリズム)
构造=> make_heap
push => push_back + push_heap
pop => pop_front + pop_heap
top =>フロント
Functor:関数呼び出し演算子( "()")をオーバーロードすることによって関数として使用できるクラス
別の意見がある場合は、メッセージを残して議論してください!