Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con la función de comparación en el set de STL (C++)

Estas en el tema de Problema con la función de comparación en el set de STL (C++) en el foro de C/C++ en Foros del Web. Hola, ando trasteando con el contenedor set de la STL de C++, y me he topado con algo que me está haciendo perder los nervios. ...
  #1 (permalink)  
Antiguo 27/11/2012, 05:20
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 12 años
Puntos: 0
Pregunta Problema con la función de comparación en el set de STL (C++)

Hola, ando trasteando con el contenedor set de la STL de C++, y me he topado con algo que me está haciendo perder los nervios. Quiero definir el puntero a una función para decirle al set de qué manera debe ordenar los elementos que yo le introduzco. Hasta ahí bien, ¿no? Pues tengo este código, que he hecho a modo de ejemplo para explicarme mejor, no tiene utilidad práctica:

Código c++:
Ver original
  1. #include <iostream>
  2. #include <set>
  3.  
  4. using namespace std;
  5.  
  6. class objeto{
  7. private:
  8.     int id;
  9. public:
  10.    
  11.     objeto(int id){
  12.         this->id = id;
  13.     }
  14.  
  15.     objeto(){
  16.         id = 0;
  17.     }
  18.  
  19.     void setId(int id){
  20.         this->id = id;
  21.     }
  22.  
  23.     int getId(){
  24.         return id;
  25.     }
  26. };
  27.  
  28. using namespace std;
  29.  
  30. bool comp(objeto* a, objeto* b){
  31.     return a->getId() < b->getId();
  32. }
  33.  
  34. int main(){
  35.    
  36.     bool(*fn_pt)(objeto*,objeto*) = comp;
  37.     set<objeto*, bool(*)(objeto*,objeto*)> conj (fn_pt);
  38.  
  39.     objeto * apuntador;
  40.     set<objeto*>::iterator it;
  41.     objeto a(35);
  42.     objeto b(17);
  43.     objeto c(34);
  44.     objeto d(18);
  45.     objeto e(44);
  46.     objeto f(1);
  47.     objeto g(42);
  48.  
  49.     conj.insert(&a);
  50.     conj.insert(&b);
  51.     conj.insert(&c);
  52.     conj.insert(&d);
  53.     conj.insert(&e);
  54.     conj.insert(&f);
  55.     conj.insert(&g);
  56.    
  57.     for(it = conj.begin(); it != conj.end(); it++){
  58.         apuntador = *it;
  59.         cout << apuntador->getId() << endl;
  60.     }
  61.  
  62.     return 0;
  63. }

Bien, comp es la función de comparación, y fn_pt el puntero a dicha función, que es la que le paso al set. Todo genial, ¿verdad? Compila perfecto, y devuelve en la salida los elementos ordenados por su Id, todo genial, de maravilla. Ahora hagamos el siguiente código:

Código c++:
Ver original
  1. #include <iostream>
  2. #include <set>
  3.  
  4. using namespace std;
  5.  
  6. class Objeto{
  7. private:
  8.     int id;
  9. public:
  10.    
  11.     Objeto(int id){
  12.         this->id = id;
  13.     }
  14.  
  15.     Objeto(){
  16.         id = 0;
  17.     }
  18.  
  19.     void setId(int id){
  20.         this->id = id;
  21.     }
  22.  
  23.     int getId(){
  24.         return id;
  25.     }
  26. };
  27.  
  28. bool comp(Objeto* a, Objeto* b){
  29.     return a->getId() < b->getId();
  30. }
  31. bool(*fn_pt)(Objeto*,Objeto*) = comp;
  32.  
  33. class Contenedor{
  34.  
  35.     private:
  36.  
  37.         set<Objeto*, bool(*)(Objeto*,Objeto*)> conj (fn_pt);
  38.  
  39.     public:
  40.  
  41.         void addObjeto(Objeto* o){
  42.             conj.insert(o);
  43.         }
  44.  
  45.         void mostrarObjetos(){
  46.             Objeto* aux;
  47.             set<Objeto*>::iterator it;
  48.             for(it = conj.begin(); it != conj.end(); it++){
  49.                 aux = *it;
  50.                 cout << aux->getId();
  51.             }
  52.         }
  53. };
  54.  
  55. int main(){
  56.  
  57.     cout << "Hola =)" << endl;
  58.  
  59.     return 0;
  60. }

Pues señoras y señores, este código no funciona, y se me está averiando el cerebro de intentar averiguar por qué. Una vez que meto el set en los datos de la clase, me tira siempre el mismo error, que el puntero fn_pt a la función comp no es un tipo, y por tanto no puede compilar, ¡¿pero por qué pasa esto si en el código anterior funcionaba perfecto?! He probado a meterlo en la parte pública y tampoco, no entiendo ya por qué pasa esto.

Si alguien me consigue explicar por qué al definirlo dentro de una clase el set deja de funcionar con el puntero a la función de comparación, le estaré profundamente agradecido.

Muchas gracias y buenos días .
  #2 (permalink)  
Antiguo 27/11/2012, 11:39
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 9 meses
Puntos: 22
Respuesta: Problema con la función de comparación en el set de STL (C++)

Hola, tu problema está en:

Código C++:
Ver original
  1. set<objeto*, bool(*)(objeto*,objeto*)> conj (fn_pt);

No puedes inicializar el objeto en la declaración, para ello tienes que hacerlo en la lista del constructor:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <set>
  3.  
  4. using namespace std;
  5.  
  6. class Objeto{
  7. private:
  8.     int id;
  9. public:
  10.  
  11.     Objeto(int id){
  12.         this->id = id;
  13.     }
  14.  
  15.     Objeto(){
  16.         id = 0;
  17.     }
  18.  
  19.     void setId(int id){
  20.         this->id = id;
  21.     }
  22.  
  23.     int getId(){
  24.         return id;
  25.     }
  26. };
  27.  
  28. bool comp(Objeto* a, Objeto* b){
  29.     return a->getId() < b->getId();
  30. }
  31. bool(*fn_pt)(Objeto*,Objeto*) = comp;
  32.  
  33. class Contenedor{
  34.  
  35.     private:
  36.  
  37.         set<Objeto*, bool(*)(Objeto*,Objeto*)> conj;
  38.  
  39.     public:
  40.  
  41.         Contenedor():conj (fn_pt){}
  42.  
  43.         void addObjeto(Objeto* o){
  44.             conj.insert(o);
  45.         }
  46.  
  47.         void mostrarObjetos(){
  48.             Objeto* aux;
  49.             set<Objeto*>::iterator it;
  50.             for(it = conj.begin(); it != conj.end(); it++){
  51.                 aux = *it;
  52.                 cout << aux->getId();
  53.             }
  54.         }
  55. };
  56.  
  57. int main(){
  58.  
  59.     cout << "Hola =)" << endl;
  60.  
  61.     return 0;
  62. }
  #3 (permalink)  
Antiguo 28/11/2012, 12:03
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 12 años
Puntos: 0
Respuesta: Problema con la función de comparación en el set de STL (C++)

Tu solución me ha funcionado. Era eso. ¡Muchas gracias! :D

Etiquetas: comparacion, puntero, set, stl
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:26.