C++ のテンプレートを使用したリンクリスト

Jay Shaw 2023年10月12日
  1. C++ のテンプレートを使用したリンクリスト
  2. .cpp ファイルからテンプレートを使用してリンクリストを作成する
  3. まとめ
C++ のテンプレートを使用したリンクリスト

テンプレートは、使用するデータタイプに問題がある場合に作成されるクラス定義のデータタイプです。テンプレートを使用すると、データタイプに柔軟に対応し、コンパイル時に入力として提供されたデータタイプのみを使用できるようになります。

この記事では、C++ のテンプレートを使用してリンクリストを作成する方法について説明します。

C++ のテンプレートを使用したリンクリスト

この記事では、ヘッダーファイル(.h)からノードとリンクリストデータを抽出するメインファイル(.cpp ファイル)を含む 3 部構成のプログラムを紹介します。プログラムは、ドライバーメソッドを含むメインファイルを介して入力を提供します。

まず、テンプレートを使用してノードを作成する方法を理解しましょう。

C++ でテンプレートクラス内のデータメンバーを初期化する

これは、プログラムがコンパイル中に開始する最初のヘッダーファイルです。ここでは、create_listInit の 2つのクラスが定義されています。

// file: init.h

#ifndef _INIT_H
#define _INIT_H

template <typename T>
class create_list;
template <typename T>
class Init {
  friend class create_list<T>;

 public:
  Init(T data = 0, Init<T> *next = 0) : data(data), next(next) { /* empty */
  }

 private:
  T data;
  Init<T> *next;
};

#endif

構文 template<typename T> class create_list; タイプ T のクラスを作成します。これは、プライマリデータタイプが指定されるまで、ユーザー定義データタイプとして T を使用するようにコンパイラに指示します。

C++ プログラムでテンプレートを使用すると、ユーザー定義のデータタイプを使用して変数を定義するための興味深い機能が提供されます。同様に、メソッドもデータタイプとして定義できるため、プログラマーにとって便利なツールになります。

構文 friend class create_list<T>; を使用するクラス create_list をフレンドクラスとしてタグ付けするようにコンパイラに指示します。フレンドクラスは、そのプライベートメンバーとパブリックメンバーをこのヘッダーファイルで共有します。

クラス create_list が定義されると、クラス Init がタイプ T で作成されます。

コンパイラが構文 friend class create_list<T>; を実行すると、このクラスのヘッダーファイル create_list.h のプライベートメンバーとパブリックメンバーを使用するようにコンパイラに指示します。

C++ のテンプレートを使用してリンクリストを作成するには、2つの主要な変数が必要です。入力値を格納するデータ変数と、次のポインターを指すノード変数です。

このプログラムでは、これら 2つの主要な変数は datanext として定義されています。次に、コンストラクターのプライベートメンバーとパブリックメンバーは、操作が実行される前にデフォルト値を使用して初期化されます。

最後に、コンストラクターpublic のメンバー変数は、コンストラクターprivate のメンバー変数で初期化されます。

C++ でテンプレートを使用してクラスリンクリストを作成する

このセクションでは、この記事の 3つのパートのうちの 2 番目のパートについて説明します。ここで説明するプログラムは、構文 #include "init.h" を使用して init.h ヘッダーファイルをインポートし、そのデータメンバーを使用して、C++ のテンプレートを使用してリンクリストを作成します。

テンプレートクラス create_list 内には、4つのパブリックメンバーがあります。コンストラクターcreate_list()、デストラクターcreate_list、および 2つのメンバーメソッド void insert()void display() です。

データタイプ T の 2つのプライベートメンバー、ポインタ*up*down が定義されています。このクラス定義のデータタイプにより、プログラムはドライバプログラムで任意のデータタイプを使用できるため、プログラマはソースコードに戻る必要がなくなります。物事を変更します。

ポインタ変数のヘッドとテールは、コンストラクタ create_list 内で初期化されます。

template <typename T>
create_list<T>::create_list() : up(0), down(0)

デストラクタ~create_list() 内で、メモリ内に保存されているオブジェクトが解放されます。

ここで、オブジェクト up に値が格納されている場合、それはポインター*a 内にコピーされます。ポインタ*b には 0 の値が与えられます。

ポインタ変数のヘッドとテールは、コンストラクタ create_list 内で初期化されます。

template <typename T>
create_list<T>::~create_list() {
  if (up) {
    Init<T> *a = up;
    Init<T> *b = 0;

a に値がある回数は、b にコピーされます。これは、変数 a 内のオブジェクトのプレースホルダーとして機能します。次に、a に次のポインタ内に格納されている値が与えられ、最後に b 内の値が解放されます。

while (a) {
  b = a;
  a = a->next;
  delete b;
}

リンクリスト内に値を追加する方法

プログラムのこの部分は、情報をパラメーターとして受け取るクラスタイプ T のメソッドを作成します。メソッド内では、if-else 条件が与えられます。

down 変数は、次のポインターを指すために使用されます。ここで、if 条件は、変数 up が空でない場合、パラメーター情報から新しいオブジェクトを作成し、それを変数 down に転送することを確認します。

else 条件内で、変数 up には、パラメーターvalue から作成されたオブジェクトである down の値が与えられます。

template <typename T>
void create_list<T>::insert(T value) {
  if (up) {
    down->next = new Init<T>(value);
    down = down->next;
  } else {
    up = down = new Init<T>(value);
  }
}

リンクリスト内の値を表示する方法

このメソッドは、リンクされたリストの内容を出力します。変数 up 内のポインター値が変数*a にコピーされます。

指定されたポインタ a に値が存在する回数の間、while ループはそれを出力してから、aup ポインタにシフトします。

template <typename T>
void create_list<T>::display() {
  if (up) {
    Init<T> *a = up;

    while (a) {
      cout << a->data << "->";
      a = a->next;
    }

以下のセクションは、C++ テンプレートを使用してリンクリストを作成するためのコードを示しています。

// file createlist.h

#ifndef _CREATELIST_H
#define _CREATELIST_H

#include <iostream>
using namespace std;

#include "init.h"

template <typename T>
class create_list {
 public:
  create_list();
  ~create_list();
  void insert(T);
  void display();

 private:
  Init<T> *up;
  Init<T> *down;
};

#endif

template <typename T>
create_list<T>::create_list() : up(0), down(0) { /* empty */
}

template <typename T>
create_list<T>::~create_list() {
  if (up) {
    Init<T> *a = up;
    Init<T> *b = 0;

    while (a) {
      b = a;
      a = a->next;
      delete b;
    }

    cout << endl;
  }
}

template <typename T>
void create_list<T>::insert(T value) {
  if (up) {
    down->next = new Init<T>(value);
    down = down->next;
  } else {
    up = down = new Init<T>(value);
  }
}

template <typename T>
void create_list<T>::display() {
  if (up) {
    Init<T> *a = up;

    while (a) {
      cout << a->data << "->";
      a = a->next;
    }

    cout << endl;
  }
}

.cpp ファイルからテンプレートを使用してリンクリストを作成する

これがプログラムの最後の部分です。create_list ヘッダーファイルが含まれ、main 関数が作成されます。

リンクリストテンプレートのデータタイプは、main 関数内に設定されます。ここで、char は、指定された for ループ内の数値の ASCII 値を出力するために使用されます。

for ループは 10 回実行され、65 から 75 までの ASCII 値、文字 A から J を出力します。list.insert(i); 構文は、i の値をメソッド add に渡します。このメソッドは、リンクリストに挿入されてから、別の値が渡されます。

最後に、list.display(); リンクリストの内容を出力します。

// file run.cpp

#include "create_list.h"

int main(int argc, char *argv[]) {
  create_list<char> created_list;
  for (char i = 65; i < 75; i++) created_list.insert(i);
  created_list.display();

まとめ

この記事では、C++ のテンプレートを使用してリンクリストを作成する方法について詳しく説明します。記事を読んだ後、読者はユーザー定義のデータタイプでプログラムを作成し、一度に複数のデータタイプでリンクされたリストを使用できるようになります。

関連記事 - C++ Linked List