]> git.llucax.com Git - z.facultad/75.29/susanita.git/blobdiff - src/persona.cpp
Agrega script para correr pruebas.
[z.facultad/75.29/susanita.git] / src / persona.cpp
index ca121a4a32c05c01f536a787ed080d4bb349de29..0016f3e01eb7aa559744ae90c40e78370ebf916b 100644 (file)
@@ -4,8 +4,9 @@
 
 /// Constructor
 Persona::
-Persona(const std::string& nombre, sexo_type sexo):
-       nombre(nombre), estado(SOLTERO), sexo(sexo), pareja(0)
+Persona(const std::string& nombre, sexo_type sexo, size_type cap):
+       nombre(nombre), prefs_hash(cap), estado(SOLTERO), sexo(sexo),
+       pareja(0), rechazos(cap)
 {
 }
 
@@ -58,17 +59,16 @@ operator<< (std::ostream& os, const Persona& p)
 }
 
 /// Función de comparación entre dos personas según nuestras preferencias
-bool
+int
 Persona::
-cmp(const Persona& p1, const Persona& p2) const
+cmp(const Persona& p1, const Persona& p2) const // O(1)
 {
-       prefs_type::const_iterator pos_p1
-               = std::find(prefs.begin(), prefs.end(), &p1);
-       prefs_type::const_iterator pos_p2
-               = std::find(prefs.begin(), prefs.end(), &p2);
-       if (pos_p1 < pos_p2)
+       int i1 = prefs_hash.get(p1.nombre); // O(1)
+       int i2 = prefs_hash.get(p2.nombre); // O(1)
+
+       if (i1 < i2)
                return 1;
-       if (pos_p1 == pos_p2)
+       if (i1 == i2)
                return 0;
        return -1;
 }
@@ -84,7 +84,7 @@ namespace
                /// devuelve true si p1 < p2
                bool operator ()(const Persona* const p1, const Persona* const p2)
                {
-                       return p.cmp(*p1, *p2) < 0;
+                       return p.cmp(*p1, *p2) < 0; // O(N)
                }
        };
 }
@@ -92,27 +92,28 @@ namespace
 /// Ordenamos las ofertas segun nuestras preferencias
 void
 Persona::
-ordenar_ofertas()
+ordenar_ofertas() // O(N.log(N))
 {
        // este sort es in-place y O(N.log(N))
        // Más info en: http://www.sgi.com/tech/stl/sort.html
+       // PersonaCmp() es O(1), asi que el orden es el mismo.
        std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this));
 }
 
 /// Nos declaramos a la persona p
 void
 Persona::
-declarar_a(Persona& p)
+declarar_a(Persona& p) // O(1)
 {
        estado = DECLARADO;
        pareja = &p;
-       p.ofertas.push_back(this);
+       p.ofertas.push_back(this); // O(1)
 }
 
 /// Nos comprometemos con la persona p, quien se nos habia declarado previamente
 void
 Persona::
-comprometer_con(Persona& p)
+comprometer_con(Persona& p) // O(N) ( es O(len(ofertas)) )
 {
        assert(p.estado == DECLARADO);
        assert(p.pareja == this);
@@ -123,7 +124,7 @@ comprometer_con(Persona& p)
                assert(pareja != 0);
                pareja->estado = SOLTERO;
                pareja->pareja = 0;
-               pareja->rechazos.push_back(&p);
+               pareja->rechazos[this->nombre] = this; // O(1)
        }
 
        // nos comprometemos
@@ -133,11 +134,39 @@ comprometer_con(Persona& p)
        p.pareja = this;
 
        // si tenemos ofertas, las rechazamos
-       for (ofertas_type::iterator pretendiente = ofertas.begin();
+       for (ofertas_type::iterator pretendiente = ofertas.begin(); // O(N)
                        pretendiente != ofertas.end(); ++pretendiente)
        {
-               (*pretendiente)->rechazos.push_back(&p);
+               (*pretendiente)->rechazos[this->nombre] = this; // O(1)
        }
-       ofertas.clear();
+       ofertas.clear(); // O(N)
+}
+
+// Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
+void
+Persona::
+comprometer_con_bt(Persona& p)
+{
+       // nos comprometemos
+       estado = COMPROMETIDO;
+       pareja = &p;
+       p.estado = COMPROMETIDO;
+       p.pareja = this;
 }
 
+// Rompemos el compromiso existente
+void
+Persona::
+romper_compromiso(Persona& p)
+{
+       assert(pareja == &p);
+       assert(p.pareja == this);
+       
+       // rompemos el compromiso
+       estado = SOLTERO;
+       pareja = 0;
+       p.estado = SOLTERO;
+       p.pareja = 0;
+}
+
+