STLスタックのシミュレーション実装

序文

私たちは以前に文字列、ベクトル、リストのシミュレーション実装を作成しました。STL ジェネリックは、これまで使用されたことのないデータ構造を理解するのに役立つことがわかります。インターフェイス名は非常に似ており、それらはすべて 6 つのインターフェイスに属します。 STL の主要コンポーネント「コンテナ」の 1 つで、この章では STL の 6 つの主要コンポーネントの 1 つである「アダプタ」について説明します。スタック (スタック) はアダプタです。

スタックとは何ですか?

C++のアドレス空間には、ローカル変数を格納するスタック領域が存在しますが、今回お話しするスタックとはスタック領域ではなく、データ構造のことです。

 スタックはよく理解されており、先入れ先出し (後入れ先出し) の原則に従っています。

では、なぜ STL ではスタックを「アダプター」と呼ぶことができるのでしょうか? 

まずアダプターとは何かを理解しましょう。現実で言うと、電源アダプターや充電アダプターがありますが、それらはどのような機能を持っているのでしょうか。

たとえば、当社の携帯電話充電アダプターを使用すると、あなたは友人の家にいて、携帯電話の電源が切れており、友人の充電器を使って携帯電話を充電したいのですが、あなたの携帯電話は Android で、友人の携帯電話は Android です。アップル、それではどうすればいいでしょうか?この時点で、友人の家に充電アダプターがあり、アダプターに差し込むと Android の充電ポートにできる場合は、問題ありません。アダプターの役割は次のようになります. ここでの STL アダプターもこの概念に似ています. ベクターなどのコンテナーに適応します. 以下でどのように適応するかを詳しく説明します.

スタックのシミュレーション実装

template<typename T, class Container = deque<T> > //Container(容器)
class stack
{
private:
	Container _data;
};

アダプターとコンテナーの違いは、そのテンプレートにコンテナーの追加テンプレートがあることです。このテンプレート タイプはコンテナーである必要があり、ここではデフォルトのパラメーター deque<T> も与えられます。Deque は二重キューです。詳細については、ここでは説明しませんので、興味があればご自身で調べてください。

メンバー変数を見ると、それはコンテナ オブジェクトです。

コンテナ オブジェクトをメンバー変数として考えてみると、どのような利点があるでしょうか?

これは、STL ジェネリック プログラミングのパワーを強調しています。スタックのインターフェイスを実装する必要がある場合は、
_data のインターフェイスを呼び出すだけで済みます。これは、これがジェネリック プログラミングであり、各コンテナーに強力な共通性があるためです。

size_t size() const
{
	return _data.size();
}

void push(const T& data)
{
	_data.push_back(data);
}

void pop()
{
	_data.pop_back();
}

bool empty() const
{
	return _data.empty();
}

T& top()
{
	return _data.back();
}

const T& top() const
{
	return _data.back();
}

これでスタックのすべてのインターフェイスが記述されました。非常に単純ではないでしょうか?

コンテナのインターフェースを呼び出して独自のインターフェースを直接実装することで、STLのジェネリックスを実感できます。

それでは、デフォルトのメンバー関数を自分で記述する必要があるのでしょうか?

コンテナはカスタム タイプである必要があり、デフォルトで生成されるメンバー関数 (構築、破壊、コピーなど) は必然的にカスタム タイプのデフォルトのメンバー関数を呼び出すため、その必要はありません。繰り返したいと言わない限り、まったく記述しません。複数のコンストラクターをロードしたい場合は、自分で記述する必要があります。

データ構造

ここでコンテナがベクトルである場合、それは連続配列で構成されるスタックである必要があります。

そして、ここで入力されたコンテナがリストの場合、それは二重リンクリストの形式のスタックになります。

アダプターはそのような効果であり、この効果を実現できる STL コンテナーに適応して、そのデータ構造を多様化できます。ただし、適応の前提条件は、コンテナがこの機能を実現できる対応するインターフェイスを持っていることです。そうでない場合は、必ずエラーが報告されます。

要約する

この記事の内容はスタックのシミュレーション実装について説明していますが、さらに重要なのは、STL の 6 つの主要コンポーネントの 1 つであるアダプターと事前に接触しており、STL ジェネリックの威力を理解していることです。

おすすめ

転載: blog.csdn.net/fengjunziya/article/details/130661210