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

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 の値から成るディクショナリを表すもので、ハッシュテーブルを使用して実装されます。値の重複は可能ですが、キーの重複は許可されていません。

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

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

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

新しいテーブルを作成するときは、型 K のユーザー提供ハッシュ関数をコンストラクタに用意する必要があります。K が Rogue Wave クラスの場合は、Rogue Wave オブジェクトのすべてがハッシュ値を返す方法を知っているので、この条件を満たすのは簡単です。実際には、クラス RWCStringRWDateRWTime、および 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 に変更します。その結果、キーのすべてが再ハッシュされます。