2015-06-25 8 views
5

Mi dispiace se esistono già domande simili sul sito Web, ma al momento non riesco a comprendere alcune parti dell'algoritmo.Ordinamento di un vettore di strutture in base ai dati contenuti

Ho uno Struct che contiene le informazioni sulle informazioni sull'account utente per il mio gioco:

struct Account 
{ 
    int Position; 
    string Name; 
    int Score; 
    string Date; 
    int Level; 

    bool operator < (User SOMETHING, User SOMETHING) 
    { 
     return (SOMETHING < SOMETHING); 
    } 
}; 

vector<Account> User; 
User.push_back(Account()); 
User.push_back(Account()); 
User.push_back(Account()); 

User[0].Position=1; 
User[1].Position=2; 
User[2].Position=3; 

sort(User.begin(), User.end(), Account); 

ho bisogno di ogni struttura del mio vettore da essere organizzato, dicono per esempio, in ordine decrescente/crescente per la "Posizione" valore che ciascuno contiene.

Ho solo bisogno di aiuto (1) funzione bool operator (ad esempio i parametri e valori di ritorno), e (2) Come devo in modo che io possa risolvere la cosa da variabili multiple come le posizioni, i punteggi & livello. (Avrei bisogno di avere funzioni operatore 3 bool?)

risposta

4

Usa std::tie, qualcosa di simile:

struct Account 
{ 
    int Position; 
    string Name; 
    int Score; 
    string Date; 
    int Level; 
}; 

bool operator < (const Account& lhs, const Account& rhs) 
{ 
    return std::tie(lhs.Name,lhs.Score,lhs.Date) < std::tie(rhs.Name,rhs.Score,rhs.Date); 
} 

fascicolerà secondo le Name prima, se Name è uguale allora secondo Score, quando entrambi Name e Score sono uguali quindi secondo Date.

ordinamento viene fatto semplicemente:

std::sort(User.begin(), User.end()); 

Il che, per impostazione predefinita, utilizza operator< sugli oggetti contenuti di tipo Account.


Aggiornamento: ho frainteso la tua domanda. Nel tuo caso hai bisogno di comparatori separati, ad es.

struct by_name_ascending 
{ 
    bool operator()(const Account& lhs, const Account& rhs) const 
    { 
     return lhs.Name < rhs.Name; 
    } 
}; 

struct by_score_descending 
{ 
    bool operator()(const Account& lhs, const Account& rhs) const 
    { 
     return lhs.Score > rhs.Score; 
    } 
}; 

e ordinare il vettore con

std::sort(User.begin(), User.end(), by_name_ascending()); 

Con lambda, si potrebbe anche usare

std::sort(User.begin(), User.end(), 
    [](const Account& lhs, const Account& rhs){ 
    return lhs.Name < rhs.Name; 
    } 
); 

direttamente, semplicemente commutando < e > per ascendente/discendente. Non c'è bisogno di altri helper o operatori nella classe/struct stessa.

+0

In realtà ho bisogno di ordinarli (1) per 1 variabile alla volta (posizioni, punteggi o date) e (2) in ordine crescente o decrescente. – Donald

+0

Nyce, ha funzionato perfettamente, grazie. – Donald

Problemi correlati