2010-02-23 13 views
5

Sto lavorando a un sistema in cui devo essere in grado di ordinare un vettore in base a un determinato predicato, su cui le mie classi non dovrebbero avere il controllo. Fondamentalmente, passo loro una classe derivata e loro ci ordinano ciecamente.Come definire un ordinamento "Do-Nothing"?

Come uno dei "deliziosi capricci", uno dei modelli di ordinamento è l'ordine di entrata. Ecco quello che ho ottenuto finora.

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(); 
    } 
}; 

Ovviamente, come strategyA è riflessiva, non può essere utilizzato, e se ho impostato su false, sarà trattare tutto come uguali e posso baciare il mio addio dati.

Quindi ecco la mia domanda. Esiste un modo per definire una funzione di predicato per l'ordinamento di un vettore che NON cambierà nulla?

Sono consapevole del fatto che probabilmente la soluzione più semplice è aggiungere un ordine di variabile di ingresso alla classe di prestito o associarlo a uno in coppia. In alternativa, potrei inserire un parametro nel predicato che dice al selezionatore se usarlo o meno.

risposta

2

Personalmente, penso che la classe strategia dovrebbe avere un metodo "sort". In questo modo, può chiamare std :: sort o non, come meglio crede. o come parte della strategia di smistamento.

La risposta di stable_sort di Darios è molto buona, se è possibile utilizzarla.

È possibile eseguire l'ordinamento in base alla posizione dell'elemento in un vettore, ma ciò non significa che gli elementi non si spostano (molti algoritmi di ordinamento scramble fondamentalmente, quindi ricorrono i dati), quindi è necessario disporre di alcuni modo affidabile per determinare dove si trovavano gli oggetti quando hai iniziato.

È possibile che il confronto mantenga una mappatura della posizione corrente in posizione originale, ma molto lavoro. Idealmente la logica deve essere incorporata nell'algoritmo di ordinamento - non solo nel confronto - ed è essenzialmente come funziona stable_sort.

Un altro problema - a seconda del contenitore - l'ordine di (dire) gli indirizzi degli articoli non è sempre l'ordine degli articoli.

1

se si tratta semplicemente di un vettore di cui si sta parlando, è possibile che si riesca a cavarsela fornendo un'interfaccia che determina se è necessario eseguire l'ordinamento o meno. i vettori non sono un contenitore ordinato, quindi è necessario ordinarli in modo esplicito. Basta non ordinarli affatto.

7

C'è un modo per definire una funzione di predicato per l'ordinamento di un vettore che NON cambierà nulla?

Dipende dall'algoritmo. Se il tuo ordinamento è un stable sort, l'ordine degli elementi "uguali" non verrà modificato (che non è definito per gli ordinamenti instabili).

Considerare l'utilizzo di std::stable_sort.

+0

La 'strategia' non dovrebbe dipendere dai dettagli dell'implementazione di ordinamento. Non si può fare affidamento su 'Strategy' che verrà usato con un algoritmo di ordinamento stabile. – Vlad

+0

@Vlad: non dirmelo;) – Dario

+0

beh, il mio commento era rivolto a topicstarter. ;) – Vlad

1

Non esiste una funzione di ordinamento che mantenga l'ordine degli articoli in base solo ai valori degli articoli. È necessario fornire ulteriori informazioni al tuo Strategy, se è possibile.