Tools.h++ 7.0 クラスライブラリ・リファレンスマニュアル: RWTPtrDlist

バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.

## RWTPtrDlist<T>

### 形式

      #include <rw/tpdlist.h>
      RWTPtrDlist<T> list;

  > 注 - 標準 C++ ライブラリがない場合は、ここで説明しているインタフェースを使用してください。標準 C++ ライブラリがある場合は、クラスリファレンスの説明にあるインタフェースを使用してください。

### 説明

  このクラスは、型 `T` へのポインタのコレクションを保守するもので、二重リンクリストとして実装されます。これはポインタにもとづくリストです。オブジェクトへのポインタが、リストを構築するリンクにコピーされたり、取り出されます。

  パラメータ `T` はリスト内に挿入されるオブジェクトの型を表すもので、クラスまたは組み込み型です。クラス `T` には次のものが必要です。

  - 等価の意味の定義 `(T::operator==(const T&))`

### 持続性

  同形

### 例

  次の例は、ユーザー型 `Dog` へのポインタの二重リンクリストを処理しています。RWTValDlist<T> の例と比較して見てください。

      #include <rw/tpdlist.h>
      #include <rw/rstream.h>
      #include <string.h>

      class Dog {
        char* name;
      public:
        Dog( const char* c) {
          name = new char[strlen(c)+1];
          strcpy(name, c);
        }

        ~Dog() { delete name; }

        // コピーコンストラクタを定義する
        Dog(const Dog& dog) {
          name = new char[strlen(dog.name)+1];
          strcpy(name, dog.name);
        }
        // 代入演算子を定義する
        void operator=(const Dog& dog) {
          if (this!=&dog) {
          delete name;
          name = new char[strlen(dog.name)+1];
          strcpy(name, dog.name);
          }
        }

        // 等価テスト演算子を定義する
        int operator==(const Dog& dog) const {
          return strcmp(name, dog.name)==0; }

        friend ostream& operator<<(ostream& str, const Dog& dog){
          str << dog.name;
          return str;}
      };

      main()  {
        RWTPtrDlist<Dog> terriers;
        terriers.insert(new Dog("Cairn Terrier"));
        terriers.insert(new Dog("Irish Terrier"));
        terriers.insert(new Dog("Schnauzer"));

        Dog key1("Schnauzer");
        cout << "The list "
             << (terriers.contains(&key1) ? "does " : "does not ")
             << "contain a Schnauzer\n";

        Dog key2("Irish Terrier");
        terriers.insertAt(
            terriers.index(&key2),
            new Dog("Fox Terrier")
          );

        Dog* d;
        while (!terriers.isEmpty()) {
          d = terriers.get();
          cout << *d << endl;
          delete d;
        }

        return 0;
      }

  #### プログラム出力:

      The list does contain a Schnauzer
      Cairn Terrier
      Fox Terrier
      Irish Terrier
      Schnauzer

### 公開コンストラクタ

      RWTPtrDlist<T>();

    空のリストを作成します。

      RWTPtrDlist<T>(const RWTPtrDlist<T>& c);

    新しい二重リンクリストを `c` のシャローコピーとして作成します。作成後、ポインタは 2 つのコレクション間で共有されます。

### 公開演算子

      RWTPtrDlist&
      operator=(const RWTPtrDlist<T>& c);

    自分自身に `c` のシャローコピーを設定します。設定後、ポインタは 2 つのコレクション間で共有されます。

      T*&
      operator[](size_t i);
      T* const&
      operator[](size_t i) const;

    リスト内の `i` 番目の値へのポインタを返します。最初の可変要素は左辺値として使用できますが、2 番目の可変要素は使用できません。インデックス `i` は 0 〜 (コレクション内の項目数 -1) の範囲になければなりません。範囲外にあると RWBoundsError 型の例外が送出されます。

### 公開メンバー関数

      void
      append(T* a);

    項目 `a` をリストの最後に追加します。

      void
      apply(void (*applyFun)(T*, void*), void* d);

    リスト内のすべての項目に対してユーザー定義関数 `applyFun` を適用します。この関数には次のようなプロトタイプが必要です。

          void yourFun(T* a, void* d);

    リスト内の各項目について、その項目へのポインタを第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ `d` として引き渡すことができます。

      T*&
      at(size_t i);
      T* const&
      at(size_t i) const;

    リスト内の `i` 番目の値へのポインタを返します。最初の可変要素は左辺値として使用できますが、2 番目の可変要素は使用できません。インデックス `i` は 0 〜 (コレクション内の項目数 -1) の範囲になければなりません。範囲外にあると RWBoundsError 型の例外が送出されます。

      void
      clear();

    コレクションからすべての項目を取り除きます。

      void
      clearAndDestroy();

    コレクション内のすべての項目を取り除き、それぞれのデストラクタを呼び出します。

      RWBoolean
      contains(const T* a) const;

    オブジェクト `a` と等しいオブジェクトがリスト内にあれば `TRUE` を、なければ `FALSE` を返します。等しいかどうかは、型 `T` に対するクラス定義の等価演算子で判定します。

      RWBoolean
      contains(RWBoolean (*testFun)(T*, void*),void* d) const;

    ユーザー定義テスト関数 `testFun` が `TRUE` を返す項目がリスト内にあれば `TRUE` を、なければ `FALSE` を返します。テスト関数には次のプロトタイプが必要です。

          RWBoolean yourTester(T*, void* d);

    リスト内の各項目について、その項目へのポインタを第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ `d` として引き渡すことができます。

      size_t
      entries() const;

    現在、コレクション内にある項目の数を返します。

      T*
      find(const T* target) const;

    オブジェクト `target` と等しい最初のオブジェクトへのポインタを返します。等しいオブジェクトがなければ NULL を返します。等しいかどうかは、型 `T` に対するクラス定義の等価演算子で判定します。

      T*
      find(RWBoolean (*testFun)(T*, void*),void* d,) const;

    ユーザー定義テスト関数 `testFun` が `TRUE` を返す最初のオブジェクトへのポインタを返します。そのような項目がなければ NULL を返します。テスト関数には次のプロトタイプが必要です。

          RWBoolean yourTester(T*, void* d);

    リスト内の各項目について、その項目へのポインタを第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ `d` として引き渡すことができます。

      T*&
      first();
      T* const&
      first() const;

    リスト内の最初の項目へのポインタを返します。リストが空であると、動作の結果は不定になります。

      T*
      get();

    リスト内の最初の項目へのポインタを返し、その項目を取り除きます。リストが空であると、動作の結果は不定になります。

      size_t
      index(const T* a);

    リスト内のオブジェクト `a` に等しい最初のオブジェクトのインデックスを返します。そのようなオブジェクトがなければ `RW_NPOS` を返します。等しいかどうかは、型 `T` に対するクラス定義の等価演算子で判定します。

      size_t
      index(RWBoolean (*testFun)(T*, void*),void* d) const;

    リスト内のユーザー定義テスト関数 `testFun` が `TRUE` を返す最初のオブジェクトのインデックスを返します。そのようなオブジェクトがなければ `RW_NPOS` を返します。テスト関数には次のプロトタイプが必要です。

          RWBoolean yourTester(T*, void* d);

    リスト内の各オブジェクトについて、そのオブジェクトへのポインタを第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ `d` として引き渡すことができます。

      void
      insert(T* a);

    オブジェクト `a` をリストの最後に追加します。

      void
      insertAt(size_t i, T* a);

    インデックス位置 `i` にオブジェクト `a` を挿入します。この位置は、0 〜 (リスト内の項目数) の範囲になければなりません。範囲外にあると RWBoundsError 型の例外が送出されます。

      RWBoolean
      isEmpty() const;

    リスト内にオブジェクトがまったくなければ `TRUE` を、あれば `FALSE` を返します。

      T*&
      last();
      T* const&
      last() const;

    リスト内の最後のオブジェクトへのポインタを返します。リストが空であると、動作の結果は不定になります。

      size_t
      occurrencesOf(const T* a) const;

    リスト内のオブジェクト `a` と等しいオブジェクトの数を返します。等しいかどうかは、型 `T` に対するクラス定義の等価演算子で判定します。

      size_t
      occurrencesOf(RWBoolean (*testFun)(T*, void*),void* d)const;

    リスト内のユーザー定義テスト関数 `testFun` が `TRUE` を返すオブジェクトの数を返します。テスト関数には次のプロトタイプが必要です。

          RWBoolean yourTester(T*, void* d);

    リスト内の各項目について、その項目へのポインタを第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ `d` として引き渡すことができます。

      void
      prepend(T* a);

    項目 `a` をリストの最初に追加します。

      T*
      remove(const T* a);

    オブジェクト `a` と等しい最初のオブジェクトを取り除いて、それへのポインタを返します。等しいオブジェクトがなければ NULL を返します。等しいかどうかは、型 `T` に対するクラス定義の等価演算子で判定します。

      T*
      remove(RWBoolean (*testFun)(T*, void*),void* d);

    ユーザー定義テスト関数 `testFun` が `TRUE` を返す最初のオブジェクトを取り除いて、それへのポインタを返します。そのようなオブジェクトがなければ NULL を返します。テスト関数には次のプロトタイプが必要です。

          RWBoolean yourTester(T*, void* d);

    リスト内の各項目について、その項目へのポインタを第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ `d` として引き渡すことができます。

      size_t
      removeAll(const T* a);

    オブジェクト `a` と等しいすべてのオブジェクトを取り除いて、その数を返します。等しいかどうかは、型 `T` に対するクラス定義の等価演算子で判定します。

      size_t
      removeAll(RWBoolean (*testFun)(T*, void*),void* d);

    ユーザー定義テスト関数 `testFun` が `TRUE` を返す、すべてのオブジェクトを取り除いて、その数を返します。テスト関数には次のプロトタイプが必要です。

          RWBoolean yourTester(T*, void* d);

    リスト内の各項目について、その項目へのポインタを第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ `d` として引き渡すことができます。

      T*
      removeAt(size_t i);

    インデックス `i` のオブジェクトを取り除き、それへのポインタを返します。`i` が無効なインデックスであると RWBoundsError 型の例外が送出されます。有効なインデックスの範囲は 0 〜 (リスト内の項目数 -1) です。

      T*
      removeFirst();

    リスト内の最初の項目を取り除き、それへのポインタを返します。リストが空であると、動作の結果は不定になります。

      T*
      removeLast();

    リスト内の最後の項目を取り除き、それへのポインタを返します。リストが空であると、動作の結果は不定になります。

### 関連の大域演算子

      RWvostream&
      operator<<(RWvostream& strm, const RWTPtrDlist<T>& coll);
      RWFile&
      operator<<(RWFile& strm, const RWTPtrDlist<T>& coll);

    出力ストリーム `strm` にコレクション `coll` を保存するか、すでに保存されている場合は、そのコレクションに対する参照を保存します。

      RWvistream&
      operator>>(RWvistream& strm, RWTPtrDlist<T>& coll);
      RWFile&
      operator>>(RWFile& strm, RWTPtrDlist<T>& coll);

    コレクション `coll` の内容を入力ストリーム `strm` から復元します。

      RWvistream&
      operator>>(RWvistream& strm, RWTPtrDlist<T>*& p);
      RWFile&
      operator>>(RWFile& strm, RWTPtrDlist<T>*& p);

    入力ストリーム `strm` 上の次のオブジェクトを調べて、ヒープから新しいコレクションを作成してそれを指すように `p` を設定するか、または前に読み込んだインスタンスを指すように `p` を設定します。コレクションをヒープから作成した場合、ユーザーはそれを削除する責任があります。