2012-07-07 6 views
1

사용자 정의 find() 함수를 구현하는 명확한 방법은 무엇입니까? 예를 들어, 연산자 ==가 클래스 X에 대한 찾기를 위해 작업하고, 기존 값에 가까운 변수의 값을 찾으려고합니다.find() 동등 연산자 오버로드

class X{ 
public: 


    double _a; 
    double _b; 
    double _c; 

X(double a, double b, double c){ 
    _a = a; 
    _b = b; 
    _c = c; 
} 

    bool operator==(const X& other) const 
    { 
     if(fabs(other._a - _a) < 0.02) return true;  
     return false; 
    } 


}; 

typedef X* ptrX; 

std::vector<ptrX> vec; 
ptrX t1 = new X(1,2,3); 
vec.push_back(t1); 
ptrX t = new X(1.01,2,3); 

bool b = (find(vec.begin(),vec.end(),t) == vec.end()); //b should be false 
+0

_Why_ 포인터를 사용하고 있습니까? 이 질문에 전혀 불필요한 것으로 보입니다. –

+0

또한 [해당 기능은 이미 온라인 데모 구현과 함께 존재합니다] (http://www.cplusplus.com/reference/algorithm/find/) –

+0

혼란 스럽다는 것 외에도 값 대신 포인터를 사용하고 있다는 사실에 기인합니다. –

답변

1

찾기 기능은 데이터가 아닌 포인터를 비교합니다. 당신이 C++ 11 호환 컴파일러가있는 경우, 대신이 작업을 수행 할 수 있어야한다 :

bool b = std::find_if(vec.begin(), vec.end(), your_deref_equal) == vec.end(); 
+0

고마워! – Raghu

0

귀하의 항등 연산자는 다음과 같습니다

bool b = std::find_if(vec.begin(), vec.end(), 
    [&](const ptrX& p){ return *t == *p; } 
) == vec.end(); 

또는 비 - C++ (11) 환경에서

괜찮습니다 (등가물은 아니지만 그런 식으로 원합니다). 그러나 문제는 벡터에 객체가 아니라 포인터를 저장한다는 점입니다. 그러므로 비교 연산자를 전혀 사용하지 마십시오 ( find, 동일하면 포인터를 비교합니다).

당신은

  • 중 하나를 벡터에 직접 객체를 포함, 즉, 쉬운 것입니다

    std::vector<X> vec; 
    X t1 = X(1,2,3); 
    vec.push_back(t1); 
    X t = X(1.01,2,3); 
    bool b = (find(vec.begin(),vec.end(),t) == vec.end()) 
    

    에 조각을 변화하여 고정 할 수 있으며, 작업,하지만하지 않을 수 있습니다 경우에 따라 (같은 개체를 벡터에서 두 번 사용하려는 경우) 허용 될 수 있습니다. 이 경우, 당신은 당신의 포인터의 컨테이너 명확한 인터페이스를 제공 벡터, 또는

  • 사용 Boost Ponter Container Libraryptr_vector는 STL 알고리즘을 사용자 정의 비교를 제공 할 수 있습니다, 다른 대답을 참조하십시오.

+0

[잘 컴파일해라] (http://ideone.com/dyV8i) (그가'find'를 찾지 못해서는 안된다 ...) –

+1

@MooingDuck : 아, 그래, 나는't '역시 포인터였습니다. 비 자격에 관해서는, 나는 그가 운이 좋았고, 반복자의 유형에서 Koenig 검색에 의해 발견되었다고 생각한다. – jpalecek

+0

아 맞아, Koening 조회, 생각하지 않았다. –