7 Persona(const std::string& nombre, sexo_type sexo, size_type cap):
8 nombre(nombre), prefs_hash(cap), estado(SOLTERO), sexo(sexo),
9 pareja(0), rechazos(cap)
13 /// Para representación
15 operator<< (std::ostream& os, const Persona::estado_type e)
19 case Persona::SOLTERO:
20 return os << "soltero";
21 case Persona::DECLARADO:
22 return os << "declarado";
23 case Persona::COMPROMETIDO:
24 return os << "comprometido";
26 assert("Estado de la persona desconocido");
27 return os << "desconocido";
31 /// Para representación
33 operator<< (std::ostream& os, const Persona::sexo_type s)
42 assert("Sexo de la persona desconocido");
43 return os << "desconocido";
47 /// Para representación
49 operator<< (std::ostream& os, const Persona& p)
51 std::string pareja = "-";
54 pareja = p.pareja->nombre;
56 os << "<" << p.nombre << " (" << p.sexo << "): " << p.estado << " - "
61 /// Función de comparación entre dos personas según nuestras preferencias
64 cmp(const Persona& p1, const Persona& p2) const // O(1)
66 int i1 = prefs_hash.get(p1.nombre); // O(1)
67 int i2 = prefs_hash.get(p2.nombre); // O(1)
76 // Para que no se exporte el símbolo, es de uso interno de este módulo
79 /// Functor de ordenamiento auxiliar
83 PersonaCmp(Persona& p): p(p) {}
84 /// devuelve true si p1 < p2
85 bool operator ()(const Persona* const p1, const Persona* const p2)
87 return p.cmp(*p1, *p2) < 0; // O(N)
92 /// Ordenamos las ofertas segun nuestras preferencias
95 ordenar_ofertas() // O(N^2.log(N^2))
97 // este sort es in-place y O(N.log(N))
98 // Más info en: http://www.sgi.com/tech/stl/sort.html
99 // Pero el PersonaCmp() es O(N)
100 std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this));
103 /// Nos declaramos a la persona p
106 declarar_a(Persona& p) // O(1)
110 p.ofertas.push_back(this); // O(1)
113 /// Nos comprometemos con la persona p, quien se nos habia declarado previamente
116 comprometer_con(Persona& p) // O(N) ( es O(len(ofertas)) )
118 assert(p.estado == DECLARADO);
119 assert(p.pareja == this);
121 // rompemos el compromiso, si hay
122 if (estado == COMPROMETIDO)
125 pareja->estado = SOLTERO;
127 pareja->rechazos[this->nombre] = this; // O(1)
131 estado = COMPROMETIDO;
133 p.estado = COMPROMETIDO;
136 // si tenemos ofertas, las rechazamos
137 for (ofertas_type::iterator pretendiente = ofertas.begin(); // O(N)
138 pretendiente != ofertas.end(); ++pretendiente)
140 (*pretendiente)->rechazos[this->nombre] = this; // O(1)
142 ofertas.clear(); // O(N)
145 // Nos comprometemos con la otra persona y a ella la comprometemos con nosotros
148 comprometer_con_bt(Persona& p)
151 estado = COMPROMETIDO;
153 p.estado = COMPROMETIDO;
157 // Rompemos el compromiso existente
160 romper_compromiso(Persona& p)
162 assert(pareja == &p);
163 assert(p.pareja == this);
165 // rompemos el compromiso