2015-06-25 8 views
5

Es tut mir leid, wenn ähnliche Fragen bereits auf der Website vorhanden sind, aber ich verstehe derzeit bestimmte Teile des Algorithmus nicht.Ein Vektor von Strukturen nach enthaltenen Daten sortieren

Ich habe eine Struktur, die Informationen über die Benutzerkontoinformationen für mein Spiel enthält:

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

ich jede Struktur meines Vektors werden müssen organisiert werden, sagen zum Beispiel, in abfallender/aufsteigender Reihenfolge für die "Position" -Wert, der jeweils enthält.

Ich brauche nur Hilfe auf (1) bool Operator-Funktion (z. B. Parameter und Rückgabewerte), und (2) Wie habe ich es so, dass ich es durch mehrere Variablen wie die Positionen, Noten & Ebene sortieren kann. (Würde ich brauche 3 Bool Operator-Funktionen haben?)

Antwort

4

Verwenden std::tie, etwa wie folgt:

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

wird nach Name zuerst sortieren, wenn Name gleich ist dann nach Score, wenn beide Name und Score sind dann gleich nach Date.

Die Sortierung erfolgt einfach durch:

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

die standardmäßig verwendet operator< auf die darin enthaltenen Objekte vom Typ Account.


Update: Ich habe Ihre Frage missverstanden. In Ihrem Fall benötigen Sie getrennte Komparatoren, z.

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

und sortieren den Vektor mit

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

Mit lambdas, könnten Sie auch

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

direkt, verwenden Sie einfach < und > für aufsteigend Schalt-/absteigend. Keine Notwendigkeit für andere Helfer oder Operatoren in der Klasse/Struktur selbst.

+0

Ich brauche sie tatsächlich sortiert (1) um 1 Variable zu einer Zeit (Positionen oder Noten oder Daten), und (2) entweder aufsteigend oder absteigend. – Donald

+0

Nyce, das hat perfekt funktioniert, danke. – Donald

Verwandte Themen