バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
#include <rw/tphasht.h> unsigned hashFun(const T&); RWTPtrHashTable<T> table(hashFun);
注 - 標準 C++ ライブラリがない場合は、ここで説明しているインタフェースを使用してください。標準 C++ ライブラリがある場合は、クラスリファレンスの説明にあるインタフェースを使用してください。
このクラスはポインタにもとづくコレクションです。ハッシュバケット・オブジェクトへのポインタをコピーしたり取り出します。
パラメータ T は、テーブルに挿入されるオブジェクトの型を表すもので、クラスまたは組み込み型です。クラス T には次のものが必要です。
新しいテーブルを作成するときは、型 T のユーザー提供のハッシュ関数をコンストラクタに用意する必要があります。T が Rogue Wave クラスの場合は、Rogue Wave オブジェクトのすべてがハッシュ値を返す方法を知っているので、この条件を満たすのは簡単です。実際には、クラス RWCString、RWDate、RWTime、および RWWString には、コンストラクタにそのまま提供できる hash と呼ばれる静的メンバー関数が含まれます。この関数には次のプロトタイプがあります。
unsigned hFun(const T& a);また、この関数はオブジェクト a の適切なハッシュ値を返さなければなりません。
オブジェクトを見つけるには、まず対象のオブジェクトをハッシュして、それが存在するバケットを判定します。次にバケットを検索して、そのオブジェクトと等しい (等価演算子で判定) オブジェクトを見つけます。
テーブル内のバケットの初期数はコンストラクタで設定します。これにはデフォルト値があります。コレクション内の項目数がバケット数よりずっと大きい場合は、バケットの検索が線形であるため効率が悪くなります。バケット数は、メンバー関数 resize() を呼び出して変更できます。この方法はすべてのキーを再ハッシュするため時間がかかります。
以上の処理を自動的に行いたい場合は、このクラスからサブクラスを作成し、必要に応じて resize() を実行するユーザー専用の insert() および remove 関数を実装することができます。
#include <rw/tphasht.h>
#include <rw/cstring.h>
#include <rw/rstream.h>
main() {
RWTPtrHashTable<RWCString> table(RWCString::hash);
RWCString *states[4] = { new RWCString("Alabama"),
new RWCString("Pennsylvania"),
new RWCString("Oregon"),
new RWCString("Montana") };
table.insert(states[0]);
table.insert(states[1]);
table.insert(states[2]);
table.insert(states[3]);
RWCString key("Oregon");
cout << "The table " <<
(table.contains(&key) ? "does " : "does not ") <<
"contain Oregon\n";
table.removeAll(&key);
cout << "Now the table " <<
(table.contains(&key) ? "does " : "does not ") <<
"contain Oregon";
delete states[0];
delete states[1];
delete states[2];
delete states[3];
return 0;
}
|
The table does contain Oregon Now the table does not contain Oregon |
RWTPtrHashTable<T>(unsigned (*hashFun)(const T&),
size_t buckets = RWDEFAULT_CAPACITY);
RWTPtrHashTable<T>(const RWTPtrHashTable<T>& c);
RWTPtrHashTable& operator=(const RWTPtrHashTable<T>& c);
void apply(void (*applyFun)(T*, void*), void* d);
void yourFun(T* a, void* d);
void clear();
void clearAndDestroy();
RWBoolean contains(const T* p) const;
size_t entries() const;
T* find(const T* target) const;
void insert(T* a);
RWBoolean isEmpty() const;
size_t occurrencesOf(const T* a) const;
T* remove(const T* a);
size_t removeAll(const T* a);
void resize(size_t N);
