set_vector_bit.h

// $Id$

/*
  COMIENZO DE DESCRIPCION
 
  Dado el siguiente archivo de cabecera {\tt set.h} escriba
  el correspondiente archivo {\tt set.cpp} con la implementaci\'on
  de las funciones indicadas a continuaci\'on:
  (i) Sencillas:
      {\tt end ()},
      {\tt erase (iterator_t p)},
      {\tt clear ()},
      {\tt retrieve (iterator_t p)};
  (ii) M\'as elaboradas:
      {\tt size ()},
      {\tt insert (const elem_t & x)},
      {\tt find (const elem_t & x)},
      {\tt erase (const elem_t & x)};
  (iii) Binarias:
      {\tt set_union (set &A,set &B, set &C)},
      {\tt set_intersection (set &A,set &B,set &C)},
      {\tt set_difference (set &A,set &B,set &C)}.
   Nota: {\tt N} es la cantidad de elementos del conjunto 
   universal, asuma que es una variable global ya definida.
  Keywords: conjunto

  FIN DE DESCRIPCION */

// -----------------------------------------------------------------
// Inicio del Archivo de Cabecera 'set.h':
const int N = 10;
#ifndef SET_H
#define SET_H

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

typedef int elem_t;                            
typedef int    (*index_fun)(const elem_t& e); // index   <-- element
typedef elem_t (*element_fun)(int i);         // element <-- index

typedef int iterator_t;

class set {
private:
  std::vector<bool> v; // vector de bits
  index_fun   index;   // index   <-- element
  element_fun element; // element <-- index
public:
  set(index_fun ifun, element_fun efun) 
    : v(N,false), index(ifun), element(efun) { }
  set(const set& S) 
    : v(S.v), index(S.index), element(S.element) { }
  iterator_t begin();
  iterator_t end();
  iterator_t next(iterator_t p);
  elem_t retrieve(iterator_t p);
  std::pair<iterator_t,bool> insert(const elem_t& x);
  iterator_t find(const elem_t& x);
  int erase(const elem_t& x);
  void erase(iterator_t p);
  void clear();
  int size();

  friend void set_union(const set &A, const set &B, set &C);
  friend void set_intersection(const set &A, const set &B, set &C);
  friend void set_difference(const set &A, const set &B, set &C);
};

void set_union(const set &A,const set &B, set &C);
void set_intersection(const set &A, const set &B, set &C);
void set_difference(const set &A, const set &B, set &C);

#endif /* SET_H */

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


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

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

// -------------------------------------------------------------------
iterator_t set::end ()  { return N ; }

// -------------------------------------------------------------------
void set::erase(iterator_t p) {
  v [p] = false;
} // end void

// -------------------------------------------------------------------
void set::clear () {
  for (int j = 0; j < v.size(); j++)  v [j] = false;
} // end void

// -------------------------------------------------------------------
elem_t set::retrieve (iterator_t p) { 
  return element (p);
} // end elem_t


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

// -------------------------------------------------------------------
int set::size () { 
  int count = 0;
  for (int j = 0; j < v.size(); j++) 
    if ( v[j] == true ) count++;
  return count; 
} // end int

// -------------------------------------------------------------------
std::pair<iterator_t,bool> set::insert(const elem_t& x) {
  int i = index(x);
  if ( v[i] == true )
    return std::pair<iterator_t,bool>(i,false);
  else {
    v [i] = true;
    return std::pair<iterator_t,bool>(i,true);
  } // end if
} // end std

// -------------------------------------------------------------------
iterator_t set::find (const elem_t& x) {
  int i = index (x);
  if ( v[i] == true )
    return i;
  else 
    return N;
} // end iterator

// -------------------------------------------------------------------
int set::erase (const elem_t& x) {
  int i = index (x);
  if ( v [i] == true ){
    v [i] = false;
    return 1; }
  else
    return 0;
} // end int


// ===================================================================
// c) Binarias:

// -------------------------------------------------------------------
void set_union (const set &A, const set &B, set &C) {
  for (int j = 0; j < N; j++) 
    C.v[j] = A.v [j] || B.v [j];
} // end void

// -------------------------------------------------------------------
void set_intersection (const set &A, const set &B, set &C) {
  for (int j = 0; j < N; j++) 
    C.v[j] = A.v [j] && B.v [j];
} // end void

// -------------------------------------------------------------------
void set_difference(const set &A, const set &B, set &C) {
  for (int j = 0; j < N; j++) 
    C.v[j] = A.v [j] && ! B.v [j];
} // end void

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

Generated by GNU Enscript 1.6.6.