2009-05-15 8 views
13

정렬 된 벡터에서 값이 x보다 작은 필드가있는 첫 번째 항목을 찾고 싶습니다.
'x'를 MyClass의 내부 값과 비교하는 비교 함수를 제공해야하지만 함수 선언을 해결할 수는 없습니다.
단순히 '<'을 오버로드 할 수는 없지만 args가 '& MyClass'이고 'float'일 때 어떻게해야합니까?upper_bound/lower_bound에 대한 비교 함수

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

답변

15

정렬 알고리즘에 어떤 기능을 전달 했습니까? upper_bound와 lower_bound에 대해 동일한 것을 사용할 수 있어야합니다.

비교 작업을 수행하는 가장 쉬운 방법은 검색 값으로 설정된 키 필드로 더미 개체를 만드는 것입니다. 그러면 비교는 항상 같은 대상 사이에있게됩니다.

편집 : 어떤 이유로 인해 적절한 비교 값으로 더미 개체를 가져올 수없는 경우 비교 functor를 만들 수 있습니다. functor는 operator()에 대해 다음과 같은 세 가지 오버로드를 제공 할 수 있습니다.

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

자세히 알 수 있듯이 그렇게가는 길입니다.

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

이가 좀 더합니다 :

+0

그게 문제 였어, 정렬 함수는 MyClass 객체에 두 개의 const 참조를 취한다. 검색 함수는 MyClass와 float을 가져야합니다. bind2nd()를 사용하는 것에 대한 동일한 문제가 있습니다. 비교 연산자 인 –

+0

()은 왜 그런 생각을하지 않았습니까? STL을 많이 사용할수록 파이썬을 더 좋아합니다. –

+0

고맙습니다. const MyClass & left, const MyClass & right? – chmike

0

내가 원하는 것은 std::bind2nd(std::less<MyClass>(), x)입니다. 그러나 물론 연산자 <을 MyClass에 정의해야합니다.

편집 : 아, 그리고 암시 적으로 변환 될 수 있도록 플로트 만 허용하는 MyClass 생성자가 필요합니다. 그러나이를 수행하는 더 좋은 방법이있을 수 있습니다.

6

당신은 더 MyClass에

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

다음과 같은 방법으로 LOWER_BOUND 호출 할 수있는이 방법으로 MyClassLessThan의 정적 인스턴스를 생성하여 마크의 솔루션을 향상시킬 수 있습니다 읽을 수있는

+1

난 아직도 더미 개체와 각 구성원에 대한 연산자() -하지만 당신의 의도를 읽을 명확입니다 - 감사합니다 Logged –