2010-02-23 16 views
5

Estoy trabajando en un sistema donde necesito poder ordenar un vector por un predicado dado, sobre el cual mis clases no deberían tener control. Básicamente, les paso una clase derivada y la clasifican ciegamente.¿Cómo puedo definir un tipo de "No hacer nada"?

Como uno de los "caprichos deliciosos", 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 strategyA es reflexiva, no puede ser utilizado, y si lo fijo a falso, que va a tratar todo como igual y me puede besar el adiós de datos.

Así que esta es mi pregunta. ¿Hay alguna manera 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 sea agregar una variable de orden de entrada a la clase de Préstamo, o asociarla con una en un par. Alternativamente, podría alimentar un parámetro con el predicado que le dice al clasificador si usarlo o no.

Respuesta

2

Personalmente, creo que la clase de estrategia debe tener un método de "especie". De esta forma, puede llamar a std :: sort o no, según lo crea conveniente. Si y cómo se convierte en parte de la estrategia de clasificación.

Darios stable_sort la respuesta es muy buena, si puede usarla.

Es posible hacer una ordenación basada en la posición del artículo en un vector, pero eso no significa que los elementos no se muevan (muchos algoritmos de clasificación básicamente compilarán-luego-recurrirán a sus datos), por lo que debe tener alguna manera confiable de determinar dónde estaban los artículos cuando comenzó.

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

Otro problema, dependiendo del contenedor, el orden de (por ejemplo) las direcciones de los artículos no siempre es el orden de los artículos.

1

si se trata simplemente de un vector de lo que está hablando, quizás pueda salirse con la suya proporcionando 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 clasifique en absoluto.

7

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

Depende del algoritmo. Si su clasificación es stable sort, el orden de los elementos "iguales" no cambiará (lo que no está definido para ordenamientos inestables).

Considere el uso de std::stable_sort.

+0

La 'Estrategia' no debe depender de los detalles de implementación de clasificación. No se puede confiar en 'Strategy' que se usará con algoritmo de ordenamiento estable. – Vlad

+0

@Vlad: No me digas;) – Dario

+0

Bueno, mi comentario fue dirigido a topicstarter. ;) – Vlad

1

No existe una función de ordenación que mantenga el orden de los elementos basándose únicamente en los valores de los elementos. Debe proporcionar más información a su Strategy, si es posible.

Cuestiones relacionadas