Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/12/2014, 05:39
Madh
 
Fecha de Ingreso: octubre-2013
Mensajes: 44
Antigüedad: 11 años, 1 mes
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?