バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
#include <rw/tphdict.h> unsigned hashFun(const K&); RWTPtrHashDictionary<K,V> dictionary(hashFun);
注 - 標準 C++ ライブラリがない場合は、ここで説明しているインタフェースを使用してください。標準 C++ ライブラリがある場合は、クラスリファレンスの説明にあるインタフェースを使用してください。
これはポインタにもとづくコレクションで、キーと値へのポインタをハッシュバケットにコピーしたり取り出します。
パラメータ K と V は、それぞれハッシュテーブルに挿入されるキーの型と値の型とを表すもので、クラスまたは基本型です。クラス 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);
RWTPtrHashDictionary<K,V>(const RWTPtrHashDictionary<K,V>& c);
RWTPtrHashDictionary<K,V>& operator=(const RWTPtrHashDictionary<K,V>& c);
V*& operator[](K* key);
void applyToKeyAndValue( void (*applyFun)(K*,V*&,void*),void* d);
void yourFun(K* key, V*& value, void* d);
void clear();
void clearAndDestroy();
RWBoolean contains(const K* key) const;
size_t entries() const;
K* find(const K* key) const;
V* findValue(const K* key) const;
K* findKeyAndValue(const K* key, V*& retVal) const;
void insertKeyAndValue(K* key, V* value);
RWBoolean isEmpty() const;
K* remove(const K* key);
void resize(size_t N);