Domanda

Sto lavorando su un sistema in cui ho bisogno di essere in grado di ordinare un vettore da un determinato predicato, che le mie classi non dovrebbero avere il controllo su. Fondamentalmente, io passo li una classe derivata e ciecamente sorta su di esso.

Come una delle "stranezze deliziosi", uno dei modelli di ordinamento è ordine di iscrizione. Ecco quello che ho 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. C'è un modo di definire una funzione predicato per l'ordinamento un vettore che non cambierà nulla?

Sono consapevole del fatto che forse la soluzione più semplice è quella di aggiungere un ordine di variabile di ingresso alla classe di prestito, o un partner con uno in una coppia. In alternativa avrei potuto nutrire un parametro con il predicato che indica al selezionatore se utilizzare o meno.

È stato utile?

Soluzione

Personalmente, penso che la classe strategia dovrebbe avere un metodo "sort". In questo modo, si può chiamare sia std :: sort o no, come meglio ritiene opportuno. Se e come entra a far parte della strategia di ordinamento.

Darios stable_sort risposta è molto buono, se è possibile utilizzarlo.

E 'possibile fare l'ordinamento in base alla posizione elemento in un vettore, ma non significa che gli elementi non si muove (molti algoritmi di ordinamento sarà essenzialmente scramble-poi-resort i dati), in modo da avere un po' affidabile modo di determinare dove gli elementi erano quando hai iniziato.

E 'possibile per il confronto di mantenere una mappatura di corrente grado di originale posizione, ma un sacco di lavoro. Idealmente la logica ha bisogno di essere integrato nel algoritmo di ordinamento - non solo il confronto -. E questo è essenzialmente come funziona stable_sort

Un altro problema - a seconda del contenitore -. L'ordine di (diciamo) indirizzi voce non è sempre l'ordine degli elementi

Altri suggerimenti

  

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

Dipende l'algoritmo. Se il tipo è un stabile sorta , l'ordine degli elementi "uguali" non essere cambiato (che è indefinito per i tipi instabili).

Si consiglia di utilizzare std::stable_sort.

se si tratta semplicemente di un vettore si sta parlando, forse si può ottenere via con fornendo un'interfaccia che determina se si deve ordinare o no. i vettori non sono un contenitore ordinata, quindi è necessario ordinarli in modo esplicito. Basta non ordinare loro a tutti.

Non v'è alcuna funzione di ordinamento, che avrebbe mantenuto l'ordine degli elementi in base solo su valori voci. È necessario fornire maggiori informazioni al vostro Strategy, se è possibile.

Un approccio diverso potrebbe essere quello di portare la semantica dei dati al contenitore. Considerare l'utilizzo di boost :: multi_index per i diversi modi di accesso e ordinamento sugli stessi dati:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top