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

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

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

## RWTIsvSlist<T>

### 形式

      #include <rw/tislist.h>
      RWTIsvSlist<T> list;

### 説明

  このクラスは、侵入的一重リンクリストを実装するクラスです。

  侵入的リストとは、リスト内のメンバーが共通基底クラス (この場合、RWIsvSlink) から継承されていなければならないものをいいます。このリストの長所は、メモリーとディスク空間に対する要求が最小であることです。また短所は、継承階層が柔軟性に欠けるため、既存クラスでの使用が多少困難であることです。非侵入的な代替リンクリストとして、クラス RWTValSlist<T> があります。

  侵入的リストの詳細は、Stroustrup (1991 年、Section 8.3.1) を参照してください。

  > 注 - 侵入的リストに項目を挿入するとき、コピーではなく実体を挿入します。

  > 各項目は 1 つのリンクフィールドのみを持つ、同じ項目を複数のリストに挿入したり、同じ項目を複数回同じリストに挿入することはできません。

### 例

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

      struct Symbol : public RWIsvSlink {
        char name[10];
        Symbol( const char* cs)
          { strncpy(name, cs, sizeof(name)); name[9] = '\0'; }
      };

      void printem(Symbol* s, void*) { cout << s->name << endl; }

      main(){
        RWTIsvSlist<Symbol> list;
        list.insert( new Symbol("one") );
        list.insert( new Symbol("two") );
        list.prepend( new Symbol("zero") );

        list.apply(printem, 0);
        list.clearAndDestroy();  // リスト内に挿入された項目を削除する
        return 0;
      }

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

      zero
      one
      two

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

      RWTIsvSlist();

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

      RWTIsvSlist(T* a);

    1 個の項目から成るリスト `a` を作成します。

### 公開メンバー関数

      void
      append(T* a);

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

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

    コレクション内のすべての項目に対して関数 `applyFun` を呼び出します。この関数には次のようなプロトタイプが必要です。

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

    項目は引数 `item` として渡されます。クライアントデータはパラメータ `d` として引き渡すことができます。

      T*
      at(size_t i) const;

    インデックス `i` の項目を返します。インデックス `i` は 0 〜 (コレクション内の項目数 -1) の範囲になければなりません。範囲外にあると `TOOL_INDEX` 型の例外が発生します。

      void
      clear();

    リストからすべての項目を取り除きます。

      void
      clearAndDestroy();

    リスト内の各項目を取り除き、それぞれに対し `delete` を呼び出します。この処理は、各項目がヒープから割り当てられていることを前提としています。

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

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

        RWBoolean yourTester(const T* item, void* d);

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

      RWBoolean
      containsReference(const T* a) const;

    アドレス `a` を持つ項目がリストにあれば `TRUE` を返します。

      size_t
      entries() const;

    現在、リストにある項目の数を返します。

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

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

          RWBoolean yourTester(const T* item, void* d);

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

      T*
      first() const;

    リスト内の最初の項目を返します (ただし、取り除きません)。リストが空であれば NULL を返します。

      T*
      get();

    リストの最初にある項目を返し、それを取り除きます。リストが空であれば `NULL` を返します。

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

    リスト内のユーザー定義テスト関数 `testFun` が `TRUE` を返す最初の項目のインデックスを返します。そのような項目がなければ `RW_NPOS` を返します。テスト関数には次のプロトタイプがなければなりません。

          RWBoolean yourTester(const T* item, void* d);

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

      void
      insert(T* a);

    項目 `a` をリストの最後に追加します。この項目を複数のリストに挿入したり同じリストに複数回挿入することはできません。

      void
      insertAt(size_t i, T* a);

    インデックス位置 `i` に項目 `a` を挿入します。この位置は、0 〜 (リスト内の項目数) の範囲になければなりません。範囲外にあると `TOOL_INDEX` 型の例外が発生します。この項目を複数のリストに挿入したり同じリストに複数回挿入することはできません。

      RWBoolean
      isEmpty() const;

    リスト内に項目がまったくなければ `TRUE` を、あれば `FALSE` を返します。

      T*
      last() const;

    リスト内の最後の項目を返します (ただし、取り除きません)。リストが空であれば `NULL` を返します。

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

    リストを走査し、ユーザー定義テスト関数 `testFun` が `TRUE` を返した項目の数を返します。テスト関数には次のプロトタイプが必要です。

          RWBoolean yourTester(const T* item, void* d);

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

      size_t
      occurrencesOfReference(const T* a) const;

    リスト内 `a` が指す項目が存在する個数を返します。項目は複数回リストに挿入できないので、この関数は 0 か 1 しか返しません。

      void
      prepend(T* a);

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

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

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

          RWBoolean yourTester(const T* item, void* d);

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

      T*
      removeAt(size_t i);

    インデックス `i` の項目を取り除き、その項目を返します。インデックス `i` は 0 〜 (コレクション内の項目数 -1) の範囲になければなりません。範囲外にあると `TOOL_INDEX` 型の例外が発生します。

      T*
      removeFirst();

    リスト内の最初の項目を取り除き、その項目を返します。リスト内が空であれば `NULL` を返します。

      T*
      removeLast();

    リスト内の最後の項目を取り除き、その項目を返します。リストが空であれば `NULL` を返します。一重リンクリスト内で最後のリンクを取り除くには、その 1 つ前のリンクにアクセスする必要があり、結果としてリスト全体を検索することになるため、この関数の処理速度はあまり速くありません。

      T*
      removeReference(T* a);

    アドレス `a` を持った項目を取り除き、その項目を返します。そのようなリンクがリスト内にある必要があります。一重リンクリストでは、この関数はあまり効率良くありません。