2009-05-15 15 views
13

İlk öğeyi, x değerinden daha küçük bir alana sahip sıralanmış bir vektörde bulmak istiyorum.
'x' değerini MyClass'taki iç değerle karşılaştıran bir karşılaştırma işlevi sağlamanız gerekiyor ancak işlev bildirimini çalışamıyorum.
Basitçe '<' aşırı yükleyemiyorum, ancak bu hatalar '& MyClass' ve 'float' olduğunda bunu nasıl yapabilirim?upper_bound/lower_bound işlevinin karşılaştırılması

float x; 
std::vector<MyClass>::iterator last = std::upper_bound(myClass.begin(),myClass.end(),x); 

cevap

15

Sıralama algoritmasına hangi işlevi ilettiniz? Aynı sayfayı upper_bound ve lower_bound için kullanabilmeniz gerekir.

Karşılaştırma çalışmasını yapmanın en kolay yolu, anahtar alanı arama değerinize ayarlanmış bir sahte nesne oluşturmaktır. Daha sonra karşılaştırma her zaman benzer nesneler arasında olacaktır.

Düzenleme: Bazı nedenlerden ötürü uygun karşılaştırma değerine sahip sahte nesne elde edemiyorsanız, bir karşılaştırma functor'ı oluşturabilirsiniz.

struct MyClassLessThan 
{ 
    bool operator() (const MyClass & left, const MyClass & right) 
    { 
     return left.key < right.key; 
    } 
    bool operator() (const MyClass & left, float right) 
    { 
     return left.key < right; 
    } 
    bool operator() (float left, const MyClass & right) 
    { 
     return left < right.key; 
    } 
}; 

Gördüğünüz gibi, bu konuda gitmek için uzun bir yol var: funktoru operatör için üç aşırı yükleri() sağlayabilir.

std::lower_bound(coll.begin(), coll.end(), target, CMyClass::CompareFloatField); 

Bu biraz daha yapar:

+0

Sorun buydu, sıralama işlevi MyClass nesnelerine iki const refs alır. Arama fonksiyonu bir MyClass ve bir float almalıdır. Şeyler karşılaştırmak için bind2nd() –

+0

operatörü() kullanmak için aynı sorun - şimdi neden bunu düşünmedim !!! STL'yi ne kadar çok kullanırsam, python'u daha çok seviyorum. Teşekkür ederim –

+0

const değil MyClass & left, const MyClass & right? – chmike

0

İhtiyacınız olan şey bence std::bind2nd(std::less<MyClass>(), x). Ancak, elbette, MyClass için operatör < tanımlanmalıdır.

Düzenleme: oh ve MyClass için yalnızca bir float kabul eden ve dolaylı olarak dönüştürülebilmesi için bir kurucuya ihtiyacınız olacağını düşünüyorum. Bununla birlikte, bunu yapmanın daha iyi bir yolu olabilir.

6

Sen ayrıca Sınıfım

class CMyClass 
{ 
    static struct _CompareFloatField 
    { 
     bool operator() (const MyClass & left, float right) //... 
     // ... 
    } CompareFloatField; 
}; 

aşağıdaki şekilde LOWER_BOUND çağırabilir Bu şekilde de MyClassLessThan statik örneğini oluşturarak Mark'ın çözüm geliştirebilir okunabilir

+1

Yine de, her üye için kukla bir nesneye ve operatöre() ihtiyacım var - ama niyetinizi okumakta daha nettir - teşekkürler –

İlgili konular