2011-07-21 34 views
10

Bir STL vektörünü iki farklı karşılaştırma kriterine göre nasıl sıralayabilirim? Varsayılan sort() işlevi yalnızca tek bir sıralayıcı nesnesi alır.Bir STL vektörünün iki değerde ayrılması

+0

Daha fazla detay verebilir misiniz? Hangi kriterleri istiyorsun? – iammilind

+0

Daha fazla bilgi için –

+0

İki farklı özelliği olan nesnelerin listesini sıralıyorum: mesafe ve önem. Bu özelliklerin bir karşılaştırması (daha yüksek önem) diğerini geçersiz kılar (daha yakın mesafe). Öyleyse, bir nesnenin itirazları 1 ve diğerinin 0 olması durumunda, mesafenin daha büyük olmasına rağmen, ikinci olandan daha yüksek sıralanacaktır. Sadece bir karşılaştırma yaparak bunu yapmanın bir yolunu anlayamıyorum. – toastie

cevap

25

İki kriteri bir arada birleştirmeniz gerekir. Her bir yapı, bir birinci ve ikinci alan ile birinci alana, sonra ikinci alana göre nasıl sıraladığınıza bir örnek.

#include <algorithm> 

struct MyEntry { 
    int first; 
    int second; 
}; 

bool compare_entry(const MyEntry & e1, const MyEntry & e2) { 
    if(e1.first != e2.first) 
    return (e1.first < e2.first); 
    return (e1.second < e2.second); 
} 

int main() { 
    std::vector<MyEntry> vec = get_some_entries(); 
    std::sort(vec.begin(), vec.end(), compare_entry); 
} 

NOT: Nawaz kodunu kullanmak için güncellendi compare_entry uygulanması.

+0

+1, Öne doğru. Ben de aynı şekilde düşündüm. Yine de OP'nin aynı çizgide düşünmesi şüphesiz. – iammilind

+0

Harika, işe yaradı, teşekkürler! Eğer (e1.first == e2.first) kısmını unuttum, bu yüzden benim için başarısız oldu. – toastie

+2

@Michael: "compary_entry" işlevinin başka bir uygulamasını ekledim. Umarım senin için iyidir. :-) +1 BTW. – Nawaz