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

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


RWTValHashTable<T>

形式

#include <rw/tvhasht.h>
unsigned hashFun(const T&);
RWTValHashTable<T> table(hashFun);

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

説明

このクラスは、型 T のパラメータ化されたハッシュテーブルを実装します。チェーンを使用してハッシュの衝突を避けています。項目の重複は許可されています。

このクラスは値にもとづくコレクションです。オブジェクトをハッシュバケットにコピーしたり取り出します。

パラメータ T は、テーブルに挿入されるオブジェクトの型を表すもので、クラスまたは組み込み型です。クラス T には次のものが必要です。

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

 unsigned hFun(const T& a);
また、この関数はオブジェクト a の適切なハッシュ値を返さなければなりません。

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

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

以上の処理を自動的に行いたい場合は、このクラスからサブクラスを作成し、必要に応じて resize() を実行するユーザー専用の insert() および remove() 関数を実装することができます。

持続性

なし

#include <rw/tvhasht.h>
#include <rw/cstring.h>
#include <rw/rstream.h>

main()  {
  RWTValHashTable<RWCString> table(RWCString::hash);

  table.insert("Alabama");   // NB: 型変換が行われる
  table.insert("Pennsylvania");
  table.insert("Oregon");
  table.insert("Montana");

  cout << "The table " <<
    (table.contains("Oregon") ? "does " : "does not ") <<
    "contain Oregon\n";

  table.removeAll("Oregon");
  cout << "Now the table "
       << (table.contains("Oregon") ? "does " : "does not ")
       << "contain Oregon";
  return 0;
}

プログラム出力:

The table does contain Oregon
Now the table does not contain Oregon

公開コンストラクタ

RWTValHashTable<T>(unsigned (*hashFun)(const T&),
                   size_t buckets = RWDEFAULT_CAPACITY);

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

RWTValHashTable<T>(const RWTValHashTable<T>& table);

新しいハッシュテーブルを table のコピーとして作成します。新しいテーブルは前のテーブルと同じ数のバケットを持ちます。したがって、オブジェクトを新しいテーブルにコピーする必要がありますが、再ハッシュはしません。

公開演算子

RWTValHashTable&
operator=(const RWTValHashTable<T>&);

自分自身に table のコピーを設定します。新しいテーブルは前のテーブルと同じ数のバケットを持ちます。したがって、オブジェクトを新しいテーブルにコピーしなければなりませんが、再ハッシュはしません。

公開メンバー関数

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

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

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

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

void
clear();

コレクション内のすべての項目を取り除きます。

RWBoolean
contains(const T& val) const;

val と等しい項目がコレクション内にあれば TRUE を、なければ FALSE を返します。等しいかどうかは、クラス定義の等価演算子で判定します。

size_t
entries() const;

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

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

val と等しい項目がコレクションにあれば TRUE を返し、その項目を k にセットします。等しい項目がなければ FALSE を返し、k は変わりません。等しいかどうかはクラス定義の等価演算子で判定します。

void
insert(const T& val);

val をコレクションに挿入します。

RWBoolean
isEmpty() const;

コレクションが空なら TRUE を、空でなければ FALSE を返します。

size_t
occurrencesOf(const T& val) const;

コレクション内の val と等しい項目の数を返します。等しいかどうかはクラス定義の等価演算子で判定します。

RWBoolean
remove(const T& val);

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

size_t
removeAll(const T& val);

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

void
resize(size_t N);

バケット数を N に変更します。コレクション内に項目が数多くあればかなり時間がかかります。