Click on the banner to return to the Class Reference home page.
Return to the Appendix home page.

©Copyright 1996 Rogue Wave Software

RWTValHashTable<T>

Alternate template: Standard C++ Library not required

Synopsis

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

Please Note!


If you do not have the Standard C++ Library, use the interface described here. Otherwise, use the interface to RWTValHashMultiSet described in the Class Reference.


Description

This class implements a parameterized hash table of types T. It uses chaining to resolve hash collisions. Duplicates are allowed.

It is a value based collection: objects are copied in and out of the hash buckets.

Parameter T represents the type of object to be inserted into the table, either a class or fundamental type. The class T must have:

A user-supplied hashing function for type T must be supplied to the constructor when creating a new table. If T is a Rogue Wave class, then this requirement is usually trivial because most Rogue Wave objects know how to return a hashing value. In fact, classes RWCString, RWDate, RWTime, and RWWString contain static member functions called hash that can be supplied to the constructor as is. The function must have prototype:

unsigned hFun(const T& a);

and should return a suitable hash value for the object a.

To find an object, it is first hashed to determine in which bucket it occurs. The bucket is then searched for an object that is equal (as determined by the equality operator) to the candidate.

The initial number of buckets in the table is set by the constructor. There is a default value. If the number of items in the collection greatly exceeds the number of buckets then efficiency will sag because each bucket must be searched linearly. The number of buckets can be changed by calling member function resize(). This is an expensive proposition because not only must all items be copied into the new buckets, but they must also be rehashed.

If you wish this to be automatically done, then you can subclass from this class and implement your own special insert() and remove() functions which perform a resize() as necessary.

Persistence

None

Example

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

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

  table.insert("Alabama");   // NB: Type conversion occurs
  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;
}

Program output

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

Public Constructors

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

Public Operators

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

Public Member Functions

void
apply(void (*applyFun)(T&, void*), void* d);
void
clear();
RWBoolean
contains(const T& val) const;
size_t
entries() const;
RWBoolean
find(const T& target, T& k) const;
void
insert(const T& val);
RWBoolean
isEmpty() const;
size_t
occurrencesOf(const T& val) const;
RWBoolean
remove(const T& val);
size_t
removeAll(const T& val);
void
resize(size_t N);