2015-06-25 22 views
5

Web sitesinde halihazırda bulunan benzer sorular varsa üzgünüm, ancak şu anda algoritmanın belirli bölümlerini anlayamıyorum. için azalan/artan sırada, organize edilmesi gereken benim vektör her yapı gerekİçeren Verilere Göre Yapıların Bir Vektörünü Sıralama

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

örneğin demek:

benim oyun için kullanıcı hesap bilgilerinin ilgili bilgiler içeren bir Struct var Her birinin içerdiği "Konum" değeri.

Sadece (1) bool operatör fonksiyonu hakkında yardım gerekir (ör parametreleri ve dönüş değerleri) ve ben pozisyonları gibi bir çok değişkenden puanları & düzey göre sıralayabilir, böylece (2) Nasıl var. (Ben 3 bool operatör fonksiyonları olması gerekir misiniz?)

cevap

4

kullanın std::tie, böyle bir şey:

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

sıralanır Name ilk göre, Name sonra Score, her iki Name göre eşitse ve Score, Date'a göre eşittir.

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

hangisi, varsayılan olarak, tip Account arasında bulunan nesneler üzerinde operator< kullanır:

Sıralama basitçe yapılır.


Güncelleştirme: Sorunuzu yanlış anlamıştım. Sizin durumunuzda, ayrılmış karşılaştırıcılara ihtiyacınız var, örn.

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

ve lambdas ile

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

ile vektör sıralamak, ayrıca doğrudan basitçe azalan/artan için < ve > anahtarlama

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

kullanabilirsiniz. Sınıftaki/yapısındaki diğer yardımcılara veya operatörlere gerek yoktur.

+0

Aslında onlara (1) 1 değişkene göre aynı anda (Konumlar veya Skorlar veya Tarihler) ve (2) Yükselen veya azalan olmalarına ihtiyacım var. – Donald

+0

Nyce, bu mükemmel çalıştı, teşekkürler. – Donald

İlgili konular