Ver Mensaje Individual
  #3 (permalink)  
Antiguo 21/10/2015, 15:11
Avatar de xKuZz
xKuZz
 
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Algoritmos con deques C++

Si no estás acostumbrado quizás te cuesta aunque no creo. Vamos a utilizar la función genérica min_element. Esta función es un template y por tanto te servirá para todo contenedor de la STL. A esta función o bien le pasas los dos iteradores como parámetros y sobrecargas el operador < o bien les pasas los dos iteradores y un functor. Yo te voy a explicar como hacerlo sobrecargando el operador <.

El ejemplo que te voy a dar es muy completo y voy a adaptarlo a tu problema para que lo veas con facilidad y no creo que tengas problemas al aplicarlo.

Supongamos una clase datoSensor como la siguiente y que la relación de orden está de ambas clases está definida por el orden usual del entero a, es decir, dados dos objetos uno es menor que otro si el a del primero es menor que el a del segundo.

Código C++:
Ver original
  1. class datoSensor{
  2.   int a, b, c;
  3.  public:
  4.    datoSensor(int &A, int &B, int &C){ // Constructor ejemplo
  5.       this->a=A;
  6.       this->b=B;
  7.       this->c=C;
  8.    }
  9.    /* Lo que sea que tengas*/
  10.   ...
  11.   bool operator<(const datoSensor &d){
  12.     // Aquí sustituye el código por el que corresponda a la relación de orden de tu clase
  13.     return this->a < d.a;
  14.   }
  15. };

Mientras tengamos ese operador definido podemos utilizar la función min_element(iterarador inicial, iterador final). Como en este caso vamos a recorrer el deque entero lo hacemos desde el iterador begin() hasta el iterador end().

Esta función te devuelve un iterador (llamémosle it) a dicho dato a sí que si quieres acceder a algún método de tu clase debes haces:
it->MetodoClase();

Si quieres pasar la clase entera por valor obviamente *it;

Veamos por tanto un ejemplo del funcionamiento de min_element en un deque

Código C++:
Ver original
  1. #include <algorithm>
  2. #include <deque>
  3. #include <iostream>
  4. using namespace std;
  5. class datoSensor{
  6.   int a, b, c;
  7.  public:
  8.    datoSensor(int &A, int &B, int &C){ // Constructor ejemplo
  9.       this->a=A;
  10.       this->b=B;
  11.       this->c=C;
  12.    }
  13.    int getA() const{
  14.      return this->a;
  15.    }
  16.    /* Lo que sea que tengas*/
  17.   ...
  18.   bool operator<(const datoSensor &d){
  19.     // Aquí sustituye el código por el que corresponda a la relación de orden de tu clase
  20.     return this->a < d.a;
  21.   }
  22. };
  23.  
  24. int main(){
  25.     datoSensor d1(1,2,3);
  26.     datoSensor d2(-3,2,1);
  27.     datoSensor d3(-2,-3,70);
  28.     deque<datoSensor> d({d1,d2,d3});
  29.     deque<datoSensor>::iterator it=min_element(d.begin(),d.end());
  30.     cout << it->getA(); // Obviamente da -3
  31. }

Análogamente para el máximo max_element(iterador_inicial,iterador_final).
max_element también utiliza el operador < así que no necesitas nada más.

Espero que se entienda con facilidad. Saludos.

Última edición por xKuZz; 21/10/2015 a las 15:14 Razón: Se me olvidó el máximo