2012-10-10 11 views
10

C++ Ordinando Array ClasseC++ Assortimento Classe Array

Ho un oggetto array che registra il seguente ..

Questo è classone.h

ClassOne 
{ 
string name; 
int data; 
float valueData; 
} 

e il costruttore vengono creati a classone.cpp

In main.cpp ho creato ClassOne Array di Size 10

#include "classone.h" 

ClassOne cone[10]; 

successivo è ho registrato diversi valore all'oggetto

e ora ClassOne ottenuto 3 oggetti

cone[0] 
name = "hello" 
data = 1 
valueData = 20 

cone[1] 
name = "panda" 
data = 2 
valueData = 15 

cone[2] 
name = "joe" 
data = 3 
valueData = 25 

Quello che voglio realizzare è fare una specie in grado di riorganizzare questo array da ValueData modulo ascendente più alto quindi .. sarà

cone[2] quindi cone[0] quindi cone[1] ..

ma la questione se io uso bubble sort, ho provato google e trovare alcuni, sono l'ordinamento per es int a[]={9,6,5,23,2,6,2,7,1,8};

Ma voglio ordina per oggetto array di classe. e ri-organizzare il valore insieme, come faccio a raggiungere questo obiettivo.

Così, quando ho Cout sarà

-- Highest to lowest -- 
1) Name: Joe , Data = 3, Value =25 
2) Name: Hello , Data =1 , Value = 20 
3) Name: Panda, Data = 2, Value = 15 

Grazie per tutto l'aiuto e la guida !!

+0

tante vote down sulla mia domanda .. Sono nuovo di C++. e non so davvero come procedere. –

risposta

2

È necessario definire un operatore di confronto per la classe. Come si determina se un oggetto è inferiore a un altro non è chiaro dalla tua domanda.

17

Il modo più semplice è quello di utilizzare la libreria standard:

#include <algorithm> 

std::sort(cone, cone + 10, 
      [](ClassOne const & a, ClassOne const & b) -> bool 
      { return a.value < b.value; }); 

Se siete disposti a definire un operatore di confronto a livello mondiale, non è nemmeno bisogno lambda:

bool operator<(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10); 

Or potresti rendere il comparatore una funzione membro. In alternativa, è possibile assegnare alla funzione di confronto un nome personalizzato e passarlo come terzo argomento di sort. Questa potrebbe essere una buona idea nel caso in cui il confronto è specifico per la tua situazione e non "naturale":

bool ValueCmp(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10, ValueCmp); 

L'ultima versione è utile se non si dispone di C++ 11 il supporto (per lambda, come nel primo caso), o se si desidera riutilizzare il comparatore in più situazioni diverse.

+2

+1, nota per i lettori - l'uso di lambdas è solo C++ 11. –

+0

Non so come applicare l'ordinamento al mio oggetto .. ho provato il tuo esempio, ma ho avuto alcuni errori .. –

+0

@baokychen: avevo sbagliato a digitare il nome della classe. Aggiorna la pagina e riprova. Dovrebbe funzionare. –

6

Usa std::sort e una opportuna funzione di ordinamento/funtore:

bool comp(const ClassOne& lhs, const ClassOne& rhs) 
{ 
    return lhs.valueData < rhs.valueData; 
} 

std::sort(cone, cone+10, comp); 

o, in C++ 11,

std::sort(std::begin(cone), std::end(cone), comp); 
+0

Ho visto la tua guida sulla libreria standard, come posso utilizzarla con il mio oggetto cono? –

+0

@baokychen proprio come sopra. Non hai un oggetto cono, hai una matrice di oggetti 'ClassOne' chiamati' cone ??. – juanchopanza

+0

Per coerenza e chiarezza, suggerisco di usare l'indirizzo-dell'operatore '&' per formare i puntatori di funzione, invece della conversione implicita dalla funzione al puntatore di funzione. –

3

Guardate la vostra fonte sorta di bolla. Ad un certo punto, verrà confrontato uno int con un altro, probabilmente con l'operatore minore di (<) o l'operatore maggiore di (>). È qui che la funzione di ordinamento determina l'ordine relativo di questi due elementi. Ripetendo il confronto molte volte, la funzione di ordinamento è in grado di determinare l'ordine totale della raccolta.

È necessario sostituire tale operazione con la propria funzione di confronto. Una funzione che prende due oggetti della classe e restituisce true se il primo deve essere considerato inferiore al secondo, false se il secondo deve essere considerato inferiore al primo e false se devono essere considerati equivalenti.

5

È possibile creare una struttura che implementa il metodo operator < che nell'intestazione <algorithm> utilizza l'intestazione <algorithm> per ordinare gli elementi iterati.

struct One { 
string name; 
int data; 
float valueData; 

bool operator < (const one &a) const{ 
return valueData <a.valueData; 
} 

}; 

allora tutto ciò che dovete fare è quello di creare un array di questo struct e ordinare utilizzando la funzione di ordinamento