open_hash_set.cpp

// $Id$

/*
  COMIENZO DE DESCRIPCION

  Diccionarios con tablas de dispersion abierta:
  dado el archivo de cabecera {\tt hash_set.h}, escriba
  el correspondiente archivo {\tt open_hash_set.cpp} con la 
  implementaci\'on de las funciones indicadas a continuaci\'on,
  (i)  Sencillas:
       {\tt erase (iterator_t p)},
       {\tt clear ()},
       {\tt size ()};
  (ii) M\'as elaboradas: 
       {\tt insert (const key_t & x)}; 
       {\tt find (const key_t & x)}; 
       {\tt erase (const key_t & x)}.
  Keywords: conjunto, diccionario

  FIN DE DESCRIPCION */

// -----------------------------------------------------------------
// Inicio del Archivo de Cabecera 'hash_set.h':

#ifndef HASH_SET_H
#define HASH_SET_H

#include <list>
#include <vector>
#include <pair.h>

typedef int key_t;
typedef int (*hash_fun)(key_t x);

class hash_set;

class iterator_t {
  friend class hash_set;
 private:
  int bucket;                   // numero de cubeta
  std::list<key_t>::iterator p; // posicion en la lista
  iterator_t(int bucket_a, std::list<key_t>::iterator p_a) 
    : bucket(bucket_a), p(p_a) { }
 public:
  iterator_t() { };
  bool operator == (iterator_t q);
  bool operator != (iterator_t q);
};

class hash_set {
 private:
  int B;       // cantidad de cubetas
  int count;   // cantidad de elementos en el conjunto
  hash_fun h;  // puntero a la funcion de hash
  std::vector< std::list<key_t> > v; // vector de cubetas
 public:
  hash_set(const hash_set& s);
  hash_set(int B_a,hash_fun h_a) : B(B_a), v(B), h(h_a), count(0) {}
  iterator_t begin();
  iterator_t end();
  iterator_t next(iterator_t p);
  key_t retrieve(iterator_t p);
  std::pair<iterator_t,bool> insert(const key_t& x);
  iterator_t find(const key_t& x);
  int erase(const key_t& x);
  void erase(iterator_t p);
  void clear();
  int size();
};

#endif /* HASH_SET_H */

// Fin del Archivo de Cabecera
// -------------------------------------------------------------------


// -------------------------------------------------------------------
// SOLUCIONES:

// ===================================================================
// a) Funciones "Sencillas":

// -------------------------------------------------------------------
void hash_set::erase(iterator_t p) {
  v [p.bucket].erase(p.p);
} // end void

// -------------------------------------------------------------------
void hash_set::clear() {
  count = 0;
  for (int j=0; j<B; j++) v [j].clear();
} // end void

// -------------------------------------------------------------------
int hash_set::size () { 
  return count; 
} // end int


// ===================================================================
// b) Funciones "Mas Elaboradas":

// -------------------------------------------------------------------
std::pair<iterator_t,bool> hash_set::insert (const key_t& x) 
{
  int b = h (x) % B;
  std::list<key_t> &L = v[b];
  std::list<key_t>::iterator p = L.begin();
  while (p != L.end() && *p != x) p++;
  if (p != L.end() && *p == x)
    return std::pair<iterator_t,bool>(iterator_t(b,p),false);
  else {
    count++;
    p = L.insert (p,x);
    return std::pair<iterator_t,bool>(iterator_t(b,p),true);
  } // end if
} // end std

// -------------------------------------------------------------------
iterator_t hash_set::find (const key_t& x) 
{
  int b = h (x) % B;
  std::list<key_t> &L = v [b];
  std::list<key_t>::iterator p = L.begin();
  while (p != L.end() && *p != x) p++;
  if (p != L.end() && *p == x) 
       return iterator_t(b,p);
  else return end();
} //end iterator_t

// -------------------------------------------------------------------
int hash_set::erase (const key_t& x) {
  int b = h(x) % B;
  std::list<key_t> &L = v[b];
  std::list<key_t>::iterator p = L.begin();
  while (p!=L.end() && *p!=x) p++;
  if (p != L.end() && *p==x) {
    L.erase (p);
    count--;
    return 1; } 
  else 
    return 0;
} // end int

// ===================================================================

Generated by GNU Enscript 1.6.6.