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

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

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

## RWTPtrHashDictionary<K,V>

### 形式

      #include <rw/tphdict.h>
      unsigned hashFun(const K&);
      RWTPtrHashDictionary<K,V> dictionary(hashFun);

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

### 説明

  このクラスは、型 `K` のキーと型 `V` の値から成るディクショナリを表すもので、ハッシュテーブルを使用して実装されます。値の重複は可能ですが、キーの重複は許可されていません。

  これはポインタにもとづくコレクションで、キーと値へのポインタをハッシュバケットにコピーしたり取り出します。

  パラメータ `K` と `V` は、それぞれハッシュテーブルに挿入されるキーの型と値の型とを表すもので、クラスまたは基本型です。クラス `K` には次のものが必要です。

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

  クラス `V` はどの型でも構いません。

  新しいテーブルを作成するときは、型 `K` のユーザー提供ハッシュ関数をコンストラクタに用意する必要があります。`K` が Rogue Wave クラスの場合は、Rogue Wave オブジェクトのすべてがハッシュ値を返す方法を知っているので、この条件を満たすのは簡単です。実際には、クラス RWCString、RWDate、RWTime、および RWWString には、コンストラクタにそのまま提供できる `hash` と呼ばれる静的メンバー関数が含まれます。この関数には次のプロトタイプがあります。

       unsigned hFun(const K& a);

  またこの関数は、オブジェクト `a` の適切なハッシュ値を返さなければなりません。

  値を見つけるには、まずキーをハッシュしてキーと値が存在するバケットを判定します。次にバケットを検索して、キーと等しい (等価演算子で判定) オブジェクトを見つけます。

  テーブル内のバケットの初期数はコンストラクタで設定します。デフォルト値があります。コレクション内のキーと値の対の数がバケット数よりずっと大きい場合は、バケットの検索が線形であるため効率が悪くなります。バケット数は、メンバー関数 `resize()` を呼び出して変更できます。しかしこの方法は、すべてのキーを再ハッシュするため時間がかかります。

  バケット数の変更を自動的に行いたいときは、このクラスのサブクラスを作成し、ユーザー専用の `insert()` および `remove()` 関数を実装して、必要に応じて `resize()` を実行させることができます。

### 持続性

  なし

### 例

      #include <rw/tphdict.h>
      #include <rw/cstring.h>
      #include <rw/rwdate.h>
      #include <rw/rstream.h>

      main()  {
        RWTPtrHashDictionary<RWCString, RWDate>
          birthdays(RWCString::hash);
        birthdays.insertKeyAndValue
          (new RWCString("John"),
           new RWDate(12, "April", 1975)
          );
        birthdays.insertKeyAndValue
          (new RWCString("Ivan"),
           new RWDate(2, "Nov", 1980)
          );

        // 別の構文
        birthdays[new RWCString("Susan")] =
          new RWDate(30, "June", 1955);
        birthdays[new RWCString("Gene")] =
          new RWDate(5, "Jan", 1981);

        // 誕生日を出力する
        RWCString key("John");
        cout << *birthdays[&key] << endl;

        birthdays.clearAndDestroy();
        return 0;
      }

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

      April 12, 1975

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

      RWTPtrHashDictionary<K,V>(unsigned (*hashKey)(const K&),
                             size_t buckets = RWDEFAULT_CAPACITY);

    空のハッシュディクショナリを作成します。第 1 引数は、型 `K` の項目 (キー) に対するユーザー定義のハッシュ関数へのポインタです。テーブルは最初 `buckets` 個のバケットから構成されていますが、メンバー関数 `resize()` で変更できます。

      RWTPtrHashDictionary<K,V>(const RWTPtrHashDictionary<K,V>& c);

    新しいハッシュディクショナリを `c` のシャローコピーとして作成します。作成後、ポインタは 2 つのコレクション間で共有されます。新しいオブジェクトは `c` と同じハッシュ関数を使用し、同じ数のバケットを持ちます。したがって、キーを再ハッシュしません。

### 公開演算子

      RWTPtrHashDictionary<K,V>&
      operator=(const RWTPtrHashDictionary<K,V>& c);

    自分自身に `c` のシャローコピーを設定します。設定後、ポインタは 2 つのコレクション間で共有されます。自分自身は `c` と同じハッシュ関数を使用し、同じ数のバケットを持ちます。したがって、キーを再ハッシュしません。

      V*&
      operator[](K* key);

    キー `key` を検索し、その値へのポインタへの参照を返します。キーがディクショナリ内にない場合はディクショナリに追加します。この場合、値へのポインタは未定義です。そのため、キーがディクショナリにない可能性がある場合、この演算子は左辺値としてしか使用できません。

### 公開メンバー関数

      void
      applyToKeyAndValue( void (*applyFun)(K*,V*&,void*),void* d);

    ディクショナリ内のすべてのキーと値の対に対してユーザー定義関数 `applyFun` を適用します。この関数には次のプロトタイプが必要です。

          void yourFun(K* key, V*& value, void* d);

    ディクショナリ内のキーと値のすべての対に対して、キーへのポインタを第 1 引数として、また値のポインタへの参照を第 2 引数として、この関数を呼び出します。キーはいっさい変更できません。この値には、新しい値と、古い値を変更した値のどちらでも使用できます。クライアントデータをパラメータ `d` として引き渡すことができます。

      void
      clear();

    コレクション内のすべてのキーと値の対を取り除きます。

      void
      clearAndDestroy();

    コレクション内のすべてのキーと値の対を取り除き、キーと値の両方に対してデストラクタを呼び出します。

      RWBoolean
      contains(const K* key) const;

    キー `key` と等しいキーがディクショナリ内にあれば `TRUE` を、なければ `FALSE` を返します。等しいかどうかは、型 `K` に対するクラス定義の等価演算子で判定します。

      size_t
      entries() const;

    現在ディクショナリにあるキーと値の対の数を返します。

      K*
      find(const K* key) const;

    キー `key` と等しいキーへのポインタを返します。等しいキーがなければ NULL を返します。等しいかどうかは、型 `K` に対するクラス定義の等価演算子で判定します。

      V*
      findValue(const K* key) const;

    キー `key` の値へのポインタを返します。そのような値がなければ NULL を返します。等しいかどうかは、型 `K` に対するクラス定義の等価演算子で判定します。

      K*
      findKeyAndValue(const K* key, V*& retVal) const;

    キー `key` と等しいキーへのポインタを返します。等しいキーがなければ NULL を返します。等しいキーがある場合、その値へのポインタは `retVal` にセットされます。等しいかどうかは型 `K` に対するクラス定義の等価演算子で判定します。

      void
      insertKeyAndValue(K* key, V* value);

    キー `key` がディクショナリにあると、値は `value` に変わります。なければ、新しいキーと値の対がディクショナリに挿入されます。

      RWBoolean
      isEmpty() const;

    ディクショナリが空なら `TRUE` を、空でなければ `FALSE` を返します。

      K*
      remove(const K* key);

    キー `key` と等しいキーの、キーと値の対を取り除き、そのキーを返します。等しいキーがない場合は NULL を返します。等しいかどうかは、型 `K` に対するクラス定義の等価演算子で判定します。

      void
      resize(size_t N);

    バケット数を `N` に変更します。その結果、キーのすべてが再ハッシュされます。