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

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;

ユーザー定義テスト関数 testFunTRUE を返す項目がリストにあれば 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;

リスト内のユーザー定義テスト関数 testFunTRUE を返す最初の項目を返します。そのような項目がなければ 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;

リスト内のユーザー定義テスト関数 testFunTRUE を返す最初の項目のインデックスを返します。そのような項目がなければ 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;

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

    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);

ユーザー定義テスト関数 testFunTRUE を返す最初の項目を取り除いて、その項目を返します。そのような項目がなければ 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 を持った項目を取り除き、その項目を返します。そのようなリンクがリスト内にある必要があります。一重リンクリストでは、この関数はあまり効率良くありません。