7 Persona(const std::string& nombre, sexo_type sexo, size_type cap):
8 nombre(nombre), estado(SOLTERO), sexo(sexo), pareja(0), rechazos(cap)
12 /// Para representación
14 operator<< (std::ostream& os, const Persona::estado_type e)
18 case Persona::SOLTERO:
19 return os << "soltero";
20 case Persona::DECLARADO:
21 return os << "declarado";
22 case Persona::COMPROMETIDO:
23 return os << "comprometido";
25 assert("Estado de la persona desconocido");
26 return os << "desconocido";
30 /// Para representación
32 operator<< (std::ostream& os, const Persona::sexo_type s)
41 assert("Sexo de la persona desconocido");
42 return os << "desconocido";
46 /// Para representación
48 operator<< (std::ostream& os, const Persona& p)
50 std::string pareja = "-";
53 pareja = p.pareja->nombre;
55 os << "<" << p.nombre << " (" << p.sexo << "): " << p.estado << " - "
60 /// Función de comparación entre dos personas según nuestras preferencias
63 cmp(const Persona& p1, const Persona& p2) const // O(N)
65 prefs_type::const_iterator pos_p1
66 = std::find(prefs.begin(), prefs.end(), &p1); // O(N)
67 prefs_type::const_iterator pos_p2
68 = std::find(prefs.begin(), prefs.end(), &p2); // O(N)
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