Listing 4
#include <array> #include <iomanip> #include <iostream> #include <iterator> #include <limits> #include <list> using std::tr1::array; using std::copy; using std::find; using std::ostream_iterator; using std::list; using std::cout; using std::setw; using std::numeric_limits; typedef list<int> bucket; typedef array<bucket, 5> table; size_t hash(int i) { // return hash value for i return i; } void show(const table& tbl) { // show contents of buckets in table for (int i = 0; i < tbl.size(); ++i) { // show contents of bucket i cout << "bucket " << setw(2) << i << ": "; copy(tbl[i].begin(), tbl[i].end(), ostream_iterator<int>(cout, " ")); cout << '\n'; } } void insert(table& tbl, int val) { // insert val into table size_t hash_val = hash(val) % tbl.size(); tbl[hash_val].push_back(val); } bool contains(const table& tbl, int val) { // return true if tbl contains val int hash_val = hash(val) % tbl.size(); bucket::const_iterator first = tbl[hash_val].begin(); bucket::const_iterator last = tbl[hash_val].end(); return find(first, last, val) != last; } void report(const table& tbl, int val) { // report whether tbl contains val cout << "table " << (contains(tbl, val) ? "contains " : "does not contain ") << val << '\n'; } int main() { // demonstrate simple hash table table tbl; insert(tbl, 3); insert(tbl, 195); insert(tbl, 5); insert(tbl, 6); insert(tbl, 55); insert(tbl, 1); insert(tbl, 33); insert(tbl, 40); show(tbl); report(tbl, 3); report(tbl, 4); return 0; }