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

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


RWTValDlist<T>

形式

#include <rw/tvdlist.h>
RWTValDlist<T> list;

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

説明

このクラスは、二重リンクリストとして実装されている値のコレクションを保守します。値にもとづくリストで、オブジェクトをリンクとの間でコピーしたり取り出したりしてリストを構築します。侵入的リスト (「RWTIsvDlist<T>」を参照) と異なり、オブジェクトをリンククラスから継承する必要はありません。ただし、挿入のたびにヒープから新しいリンクを割り当て、そのリンクにオブジェクトをコピーする必要があるので、侵入的リストよりも多少効率が悪くなります。

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

持続性

同形

次の例は、ユーザー型 Dog の二重リンクリストを処理しています。

#include <rw/tvdlist.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()  {
  RWTValDlist<Dog> terriers;
  terriers.insert("Cairn Terrier");   // 自動型変換が行われる
  terriers.insert("Irish Terrier");
  terriers.insert("Schnauzer");

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

  terriers.insertAt(
      terriers.index("Irish Terrier"),
      "Fox Terrier"
    );

  while (!terriers.isEmpty())
    cout << terriers.get() << endl;

  return 0;
}

プログラム出力:

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

公開コンストラクタ

RWTValDlist<T>();

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

RWTValDlist<T>(const RWTValDlist<T>& list);

リスト list のコピーを作成します。コピーコンストラクタ T の性質上、リスト内のすべての項目をコピーしなければならないので、かなり時間がかかります。

公開演算子

RWTValDlist&
operator=(const RWTValDlist<T>& list);

自分自身にリスト list のコピーを設定します。コピーコンストラクタ T の性質上、リスト内のすべての項目をコピーしなければならないので、かなり時間がかかります。

T&
operator[](size_t i);

インデックス i の項目への参照を返します。結果を左辺値として使用できます。i が無効なインデックスであると RWBoundsError 型の例外が発生します。有効なインデックスの範囲は 0 〜 (リスト内の項目数 -1) です。

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

インデックス i の項目のコピーを返します。結果は左辺値として使用できません。i が無効なインデックスであると RWBoundsError 型の例外が発生します。有効なインデックスの範囲は 0 〜 (リスト内の項目数 -1) です。

公開メンバー関数

void
append(const T& a);

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

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

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

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

クライアントデータをパラメータ d として引き渡します。

T&
at(size_t i);

インデックス i の項目への参照を返します。結果を左辺値として使用できます。i が無効なインデックスであると RWBoundsError 型の例外が発生します。有効なインデックスの範囲は 0 〜 (リスト内の項目数 -1) です。

const T&
at(size_t i) const;

インデックス i の項目のコピーを返します。結果は左辺値として使用できません。i が無効なインデックスであると RWBoundsError 型の例外が発生します。有効なインデックスの範囲は 0 〜 (リスト内の項目数 -1) です。

void
clear();

リストからすべての項目を取り除き、それぞれのデストラクタがあればそれを呼び出します。

RWBoolean
contains(const T& a) const;

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

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

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

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

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

size_t
entries() const;

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

RWBoolean
find(const T& target, T& k) const;

オブジェクト a と等しいオブジェクトがリストにあれば TRUE を返し、そのオブジェクトのコピーを k にセットします。等しいオブジェクトがなければ FALSE を返し、k は変わりません。等しいかどうかはクラス定義の等価演算子で判定します。オブジェクトのコピーが必要なければ contains() を使用してください。

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

ユーザー定義テスト関数 testFunTRUE を返すオブジェクトがリストにあれば TRUE を返し、そのオブジェクトのコピーを k にセットします。そのようなオブジェクトがなければ FALSE を返し、k は使用しません。テスト関数には次のプロトタイプが必要です。

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

リスト内の各項目について、その項目を第 1 引数としてこの関数を呼び出します。クライアントデータをパラメータ d として引き渡すことができます。オブジェクトのコピーが必要なければ、contains() を使用してください。

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

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

T
get();

リストの最初の項目を返し、その項目を取り除きます。リストが空であれば、動作は不定になります。

size_t
index(const T& a);

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

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

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

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

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

void
insert(const T& a);

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

void
insertAt(size_t i, const T& a);

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

RWBoolean
isEmpty() const;

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

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

リスト内の最後の項目を返します (ただし、取り除きません)。リストが空であれば、動作は不定になります。

size_t
occurrencesOf(const T& a) const;

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

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

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

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

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

void
prepend(const T& a);

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

RWBoolean
remove(const T& a);

オブジェクト a と等しい最初のオブジェクトを取り除いて TRUE を返します。等しいオブジェクトがなければ FALSE を返します。等しいかどうかはクラス定義の等価演算子で判定します。

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

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

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

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

size_t
removeAll(const T& a);

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

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

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

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

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

T
removeAt(size_t i);

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

T
removeFirst();

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

T
removeLast();

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

関連の大域演算子

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

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

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

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

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

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