Pregunta

Estoy trabajando en un sistema en el que necesito poder clasificar un vector mediante un predicado determinado, sobre el que mis clases no deberían controlar. Básicamente, les paso una clase derivada y lo clasifican ciegamente en ella.

Como una de las "peculiaridades encantadoras", uno de los patrones de clasificación es el orden de entrada. Esto es lo que tengo hasta ahora.

struct Strategy
{
   virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0;
};

struct strategyA : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return true;
   }
};

struct strategyB : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getID() > rhs.getID();
   }
};

struct strategyC : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getFee() > rhs.getFee();
   }
};

Obviamente, como la estrategia es reflexiva, no se puede usar, y si lo configuro en falso, tratará todo como igual y puedo despedirme de mis datos.

Así que aquí está mi pregunta. ¿Hay alguna forma de definir una función de predicado para clasificar un vector que no cambiará nada?

Soy consciente de que posiblemente la solución más simple es agregar una variable de orden de entrada a la clase de préstamo o asociarla con uno en un par. Alternativamente, podría alimentar un parámetro con el predicado que le dice al clasificador si lo usa o no.

¿Fue útil?

Solución

Personalmente, creo que su clase de estrategia debería tener un método de "clasificación". De esa manera, puede llamar a std :: sort o no, como lo considera adecuado. Ya sea así como cómo se convierte en parte de la estrategia de clasificación.

La respuesta de Darios Stable_Sort es muy buena, si puede usarla.

Es posible realizar la clasificación en función de la posición del elemento en un vector, pero no significa que los elementos no se muevan (muchos algoritmos de tipo básicamente revelarán sus datos), por lo que debe tener una forma confiable de determinar donde estaban los artículos cuando empezaste.

Es posible que la comparación mantenga un mapeo de la posición actual a la posición original, pero mucho trabajo. Idealmente, la lógica debe integrarse en el algoritmo de clasificación, no solo en la comparación, y así es esencialmente cómo funciona Stable_Sort.

Otro problema, dependiendo del contenedor, el orden de (digamos) direcciones del elemento no siempre es el orden de los elementos.

Otros consejos

¿Hay alguna forma de definir una función de predicado para clasificar un vector que no cambiará nada?

Depende del algoritmo. Si tu tipo es un clasificación estable, el orden de elementos "iguales" no se cambiará (que no está definido para tipos inestables).

Considere usar std::stable_sort.

Si es simplemente un vector del que está hablando, tal vez pueda salirse con la suya proporcionar una interfaz que determine si debe ordenar o no. Los vectores no son un contenedor ordenado, por lo que debe ordenarlos explícitamente. Simplemente no los ordenes en absoluto.

No existe una función de clasificación que mantenga el orden de los elementos basado solo en los valores de los elementos. Necesita proporcionar más información a su Strategy, si es posible.

Un enfoque diferente podría ser llevar la semántica de sus datos al contenedor. Considere usar Boost :: Multi_index para diferentes formas de acceso y ordenar en los mismos datos:

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top