conjunto1.cpp

// $Id$

/*
  COMIENZO DE DESCRIPCION

Diversas operaciones con conjuntos:
purge            : purga elementos repetidos de una lista usando 
                   un conjunto como estructura auxiliar y con 
                   una implementacion tal que sea O (n).
set_intersection : interseccion de conjuntos;
prints           : imprime los elementos de un conjunto.
Keywords: conjunto, lista

  FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <iostream>
#include <list>
#include <set>
#include "./util.h"
using namespace std;

// -------------------------------------------------------------------
// Purgar los elementos repetidos de una lista usando un conjunto
// como estructura auxiliar y con una implementacion de O (n).
//
// Observaciones:
//
// 1) antes, en el tema "listas", vimos una implementacion que 
//    es O (n^2), la cual tambien esta en los apuntes;
//
// 2) aqui, en "conjuntos", usamos una implementacion de O (n)
//    siempre que las operaciones S.find () y S.insert () esten 
//    eficientemente implementadas como para ser de O (1)
template <class T>
void purge (list <T> & L) {
  typename list <T> :: iterator p;
  set <T> S;
  T  x ;
  p = L.begin ();
  while (p != L.end()) {
    x = *p;
    if ( S.find (x) != S.end () ) p = L.erase (p);
    else {
      S.insert(x);
      p++;
    } // end if
  } // end while
} // end void

// -------------------------------------------------------------------
template <class T>
void set_intersection (set <T> & A, set <T> & B,set <T> & C) {
  typename set <T> :: iterator p ;
  T x ;
  C.clear ();
  p = A.begin();
  while ( p != A.end () ) {
    x = *p++;
    if ( B.find (x) != B.end () ) C.insert (x);
  } // end while
} // end void

// -------------------------------------------------------------------
template <class T>
void prints (set <T> & S) {
  typename set <T> :: iterator p ;
  p = S.begin ();
  while (p != S.end ()) cout << *p++ << " ";
  cout << endl;
} // end void

// -----------------------------------------------------------------
int main () {
  list  <int> L;
  set   <int> A, B, C;

  for (int j = 0 ; j < 20 ; j++) L.insert ( L.end(), irand (20));

  cout << endl ;
  cout << "Antes de purge " << endl;
  printl (L);

  purge (L);

  cout << endl ;
  cout << "Despues de purge " << endl;
  printl (L);

  for (int j = 0 ; j < 20 ; j++) {
    A.insert (irand (40));
    B.insert (irand (40));
  } // end for

  set_intersection (A,B,C);

  cout << endl ; cout << "A: ";
  prints (A);

  cout << endl ; cout << "B: ";
  prints (B);

  cout << endl ; cout << "C = interseccion (A,B): ";
  prints (C);

  cout << endl ;
  return 0 ;
} // end main
// -----------------------------------------------------------------

Generated by GNU Enscript 1.6.6.