ismapset.cpp
// $Id$
/*
COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funci\'on predicado
#bool is_mapped_set(set<int> &A,set<int> &B,int (*mapfun)(int));#
que retorna verdadero si el conjunto #B# contiene los elementos
de #A#, mapeados via la funcion #mapfun#.
[Tomado en recuperatorio 29-NOV-2007].
keywords: conjunto
FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <iostream>
#include <vector>
#include <set>
using namespace std ;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int is_mapped_set(set<int> &A, set<int> &B, int (*mapfun)(int)) {
// `fA' contiene la imagen de todos los elementos de `A'
set<int> fA;
set<int>::iterator p=A.begin();
while (p!=A.end()) {
fA.insert(mapfun(*p));
p++;
}
// Verifica que sea igual a `B' usando
// la comparacion de conjuntos
return fA==B;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int is_mapped_set2(set<int> &A, set<int> &B, int (*mapfun)(int)) {
// Si la funcion es biunivoca, (es decir si x!=y implica
// f(x)!=f(y)), entonces se puede hacer `in-place' (sin
// contenedores auxiliares, recorriendo los elementos `x'
// de `A' y verificando que `f(x)' este en `B'. Ademas
// hay que verificar que los tamanos sean iguales.
if (A.size()!=B.size()) return 0;
set<int>::iterator p=A.begin();
while (p!=A.end())
if (B.find(mapfun(*p++))==B.end()) return 0;
return 1;
}
// La funcion cuadrado (NO es biunivoca)
int square(int x) { return x*x; }
// La funcion x -> -x (SI es biunivoca)
int neg(int x) { return -x; }
//--------------------------------------------------------------------
int main() {
set<int> A,B,B2;
A.insert(-5);
A.insert(-3);
A.insert(5);
A.insert(10);
B.insert(9);
B.insert(25);
B.insert(100);
B2.insert(5);
B2.insert(3);
B2.insert(-5);
B2.insert(-10);
printf("\n\n----------------\n");
printf("Usando is-mapped-set()\n");
printf("B==sq(A)? %d (deberia ser 'true')\n",
is_mapped_set(A,B,square));
printf("B2==neg(A)? %d (deberia ser 'true')\n",
is_mapped_set(A,B2,neg));
printf("\n\n----------------\n");
printf("\n\nUsando is-mapped-set2() \n"
" (Solo para funciones biunivocas!!)\n");
printf("B==sq(A)? %d (deberia ser 'true')\n",
is_mapped_set2(A,B,square));
printf("B2==neg(A)? %d (deberia ser 'true')\n",
is_mapped_set2(A,B2,neg));
printf("\n\n----------------\n");
B.insert(2);
printf("B==sq(A)? %d (deberia ser 'false')\n",
is_mapped_set(A,B,square));
B.erase(2);
B.erase(100);
printf("B==sq(A)? %d (deberia ser 'false')\n",
is_mapped_set(A,B,square));
B.insert(100);
printf("B==sq(A)? %d (deberia ser 'true')\n",
is_mapped_set(A,B,square));
}
Generated by GNU Enscript 1.6.6.