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

Sort y sobrecarga del operador <

Estas en el tema de Sort y sobrecarga del operador < en el foro de C/C++ en Foros del Web. Hola a todos, estoy teniendo algunos problemas bastante raros con la sobrecarga del operador < de una clase para poder realizar un sort a un ...
  #1 (permalink)  
Antiguo 03/12/2014, 05:39
 
Fecha de Ingreso: octubre-2013
Mensajes: 44
Antigüedad: 10 años, 5 meses
Puntos: 5
Sort y sobrecarga del operador <

Hola a todos, estoy teniendo algunos problemas bastante raros con la sobrecarga del operador < de una clase para poder realizar un sort a un vector que tengo.

Resulta que yo tengo el siguiente código:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6.  
  7. class Nodo{
  8.  
  9. public:
  10.     int dato;
  11.     bool marca;
  12.  
  13.     bool operator < (const Nodo*& other) const
  14.     {
  15.         return (dato < other->dato);
  16.     }    
  17. };
  18.  
  19.  
  20.  
  21. int main(void){
  22.  
  23.     Nodo** array = new Nodo* [10];
  24.     for (int i=0; i<10; i++){
  25.             array[i] = new Nodo();
  26.             array[i]->dato = i;
  27.             array[i]->marca = false;
  28.     }
  29.  
  30.  
  31.     //INTRODUCIR DATOS EN VECTOR
  32.     vector<Nodo*> lista;
  33.  
  34.     lista.push_back(array[8]);
  35.     lista.push_back(array[5]);
  36.     lista.push_back(array[2]);
  37.     lista.push_back(array[9]);
  38.     lista.push_back(array[6]);
  39.     lista.push_back(array[2]);
  40.     lista.push_back(array[1]);
  41.     lista.push_back(array[2]);
  42.     lista.push_back(array[2]);
  43.  
  44.  
  45.     //MOSTRAR POR PANTALLA
  46.     for (int i=0; i<lista.size(); i++)
  47.         cout << lista[i]->dato << ",";
  48.     cout << endl;
  49.  
  50.     sort(lista.begin(), lista.end());
  51.  
  52.     for (int i=0; i<lista.size(); i++)
  53.         cout << lista[i]->dato << ",";
  54.     cout << endl;
  55.  
  56.     return 0;
  57. }

Este código funciona. Funciona perfectamente, lo podéis comprobar que la salida por pantalla será tal que así:

Código C++:
Ver original
  1. 8,5,2,9,6,2,1,2,2,
  2. 1,2,2,2,2,5,6,8,9,

Ahora bien, yo estoy trabajando con Qt ya que estoy realizando una aplicación gráfica, y este código no me funciona. Compilar, compila perfectamente, pero a la hora de ejecutar me doy cuenta de que no ordena correctamente, intercambia algunos valores por otros y ya.

He probado a declarar un QVector en vez de un std::vector, y ha utilizar la llamada qSort() en vez de sort(), los cuales creo que son equivalentes, y sigo teniendo el mismo problema.

Solo he conseguido que funcione correctamente si no llamo al operador sobrecargado y hago algo tal que así:
Código C++:
Ver original
  1. QVector<Nodo*> lista;
  2. ...
  3. ...
  4.  
  5. bool lessThan( Nodo* & e1, Nodo* & e2 ){
  6.  
  7.     return e1->dato < e2->dato;
  8. }
  9.  
  10. void Robot::ordenar(){
  11.  
  12.     for (int i=0; i<lista.size(); i++)
  13.         cout << lista[i]->dato << ",";
  14.     cout << endl;
  15.  
  16.     qSort(lista.begin(),lista.end(),lessThan);
  17.  
  18.     for (int i=0; i<lista.size(); i++)
  19.         cout << lista[i]->dato << ",";
  20.     cout << endl;
  21. }

De esta forma funciona correctamente con Qt, pero no me gusta. Si tengo la clase sobrecargada con el operador < me gustaría poder utilizarlo, para no tener que crear otra función como lessThan().

¿Alguna idea?
  #2 (permalink)  
Antiguo 03/12/2014, 05:50
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Sort y sobrecarga del operador <

Código C++:
Ver original
  1. Nodo*&

¿Por qué tanto odio? Qué sentido tiene pasar la referencia de un puntero?

Cuando tu declaras una referencia, el compilador trata esa variable como si se tratase de un puntero. El programador no se entera porque es un proceso transparente para el, pero eso no quiere decir que sea inocuo. Acceder a una referencia es tan costoso como acceder a un puntero, luego acceder a un puntero a través de una referencia cuesta el doble que acceder directamente al puntero.

Si lo has hecho para evitar la "copia" del objeto, no has conseguido evitar tal cosa, ya que cuando un puntero se pasa por valor, lo único que se copia es la dirección de memoria apuntada, es decir, el valor del puntero.

Código C++:
Ver original
  1. bool operator < (const Nodo* other) const
  2. {
  3.   return (dato < other->dato);
  4. }

Esta nueva versión funciona igual de bien que la anterior, bueno, miento, funciona mejor ya que, has eliminado algo de overhead.

Hablando de tu problema, el origen se encuentra en que el primer miembro de la comparación, tal y como está implementada, deber ser un objeto pasado por valor (o referencia)... y tu le intentas pasar a través de "sort" o "qsort" un puntero.

Prueba con esto:

Código C++:
Ver original
  1. class Nodo{
  2. public:
  3.     int dato;
  4.     bool marca;
  5.  
  6.     friend bool operator < (const Nodo* nodo1, const Nodo* nodo2);
  7. };
  8.  
  9. bool operator < (const Nodo* nodo1, const Nodo* nodo2)
  10. {
  11.     return (nodo1->dato < nodo2->dato);
  12. }

Con esto ya tienes un operador capaz de trabajar con punteros de tipo "Nodo"
  #3 (permalink)  
Antiguo 03/12/2014, 06:16
 
Fecha de Ingreso: octubre-2013
Mensajes: 44
Antigüedad: 10 años, 5 meses
Puntos: 5
Respuesta: Sort y sobrecarga del operador <

Muchas gracias, no voy a utilizar referencias pues sin ellas funciona igual, o mejor como tu comentas.

Sin embargo sigo teniendo el mismo problema. Pero no se donde puede estar el error. Pues el código por separado funciona bien, pero en mi proyecto no. Muchas gracias por tus palabras, seguiré intenado ver porqué en el proyecto no funciona.

Saludos!
  #4 (permalink)  
Antiguo 03/12/2014, 07:49
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Sort y sobrecarga del operador <

Has probado la opción del operador con dos parámetros??
  #5 (permalink)  
Antiguo 03/12/2014, 09:19
 
Fecha de Ingreso: octubre-2013
Mensajes: 44
Antigüedad: 10 años, 5 meses
Puntos: 5
Respuesta: Sort y sobrecarga del operador <

Cita:
Iniciado por eferion Ver Mensaje
Has probado la opción del operador con dos parámetros??
Si, pero no me funciono. Al final he optado por pasarle el tercer parametro al sort.

Etiquetas: clase, funcion, int, operador, sobrecarga, sort
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 10:55.