]> git.llucax.com Git - z.facultad/75.29/susanita.git/blobdiff - src/persona.h
Agrega gráficos de orden y otras correcciones mínimas al informe.
[z.facultad/75.29/susanita.git] / src / persona.h
index 925cdff811fc29d4dc9a49399242dcaae36a0a35..6f44c887c5126eacd6b15b76e8a593c23c88752f 100644 (file)
@@ -5,13 +5,15 @@
 #include <string>
 #include <ostream>
 #include <istream>
+#include "hashtable.h"
 
 struct Persona
 {
        /// Tipos de listas
        typedef std::deque< Persona* > prefs_type;
        typedef std::deque< Persona* > ofertas_type;
-       typedef std::deque< Persona* > rechazos_type;
+       typedef HashTable rechazos_type;
+       typedef HashTable::size_type size_type;
 
        /// Estados posibles de una persona
        enum estado_type { SOLTERO, DECLARADO, COMPROMETIDO };
@@ -20,14 +22,20 @@ struct Persona
        enum sexo_type { M, F };
 
        /// Constructor
-       Persona(const std::string& nombre, sexo_type sexo);
-       
+       Persona(const std::string& nombre, sexo_type sexo, size_type cap);
+
        /// Nombre de la persona, sólo con fines de representación
        std::string nombre;
 
-       /// Lista de personas que prefiere, la primera de la lista es la
-       /// que mejor posicionada esta
+       /// Para la lista de personas que prefiere usamos dos estructuras: la
+       /// primera es una lista en donde el primer elemento es la persona
+       /// mejor posicionada; la segunda es un hash indexado por el nombre de
+       /// la persona, y como valor la posicion numerica.
+       /// Esta dualidad nos permite tener iteracion en orden, O(1) en
+       /// encontrar el mejor, y O(1) en ver quien es el preferido entre dos
+       /// personas.
        prefs_type prefs;
+       HashTable<int> prefs_hash;
 
        /// Estado de la persona
        estado_type estado;
@@ -45,7 +53,7 @@ struct Persona
        rechazos_type rechazos;
 
        /// Función de comparación entre dos personas según nuestras prefs
-       bool cmp(const Persona& p1, const Persona& p2) const;
+       int cmp(const Persona& p1, const Persona& p2) const;
 
        /// Ordenamos las ofertas según nuestras preferencias
        void ordenar_ofertas();
@@ -56,7 +64,12 @@ struct Persona
        /// Nos comprometemos con la persona p, quien se nos habia declarado
        /// previamente
        void comprometer_con(Persona& p);
-
+       
+       // Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
+       void comprometer_con_bt(Persona& p);
+       
+       // Rompemos el compromiso
+       void romper_compromiso(Persona& p);
 };
 
 /// Para representación