2010-06-22 11 views
0

나는 내가이 표준의 핵심 :: 내가 달성하고자하는 어떤표준 : :지도 : : (

struct PpointKey{ 
     unsigned int xp,yp; //pixel coordinates 

     unsigned int side; 

     PpointKey(unsigned xp,unsigned yp,unsigned side=5):xp(xp),yp(yp),side(side) 
     {} 


     bool operator==(const PpointKey& other) const{ 
       const unsigned int x = other.xp; 
       const unsigned int y = other.yp; 

       return ((x>=xp && x<=xp+side) && (y>=yp && y<=yp+side)); 
     } 

     bool operator<(const PpointKey& other) const{ 

       const unsigned int x = other.xp; 
       const unsigned int y = other.yp; 

       const unsigned other_distance_2 = x*x + y*y; 

       const unsigned this_distance_2 = this->xp*this->xp + this->yp * this->yp; 

       return this_distance_2 < other_distance_2; 
     } 
}; 

가 찾기를 사용하는 맵으로 사용하고 간단한 구조체가) (발견)를 사용하여 side 거리 내에 xp, yp 속성이있는 키를 사용하여 맵에 액세스하십시오. I는 (x, y)는 튜플이 있다면 즉, I지도 내부 찾을 사용이 가능하다 연산자 == 함수

return ((x>=xp && x<=xp+side) && (y>=yp && y<=yp+side)); 

내부의 조건을 만족 제 PpointKey을 찾을 하시겠습니까? 나는 map.end()를 얻고있다. find() 함수가 연산자 ==를 사용하는지 확인하고 싶다. 어쩌면 검색 알고리즘이 더 좋을까요?

미리 감사드립니다.

+0

'std :: map'은'operator <'만을 사용한다는 것을 명심하십시오. 두 키가 다른 키보다 작지 않으면 두 개의 키가 같은 것으로 간주됩니다. –

답변

1

findmap의 기능은 operator==을 사용하지 않습니다.

begin()end() 이터레이터 map을 전달하면 std::find을 사용할 수 있습니다. 시퀀스를 한 번에 하나씩 반복하고 일치하는 첫 번째 객체를 생성합니다 (복잡성은 선형 임).

발생하는 문제는 조작자 과부하를 남용했기 때문입니다.

T operator==(T lhs, T rhs) 
{ 
    return !(lhs < rhs) && !(rhs < lhs); 
} 

그리고이 때문에 당신이 다른 하나를 대체 할 수있는, 당신의 정의의 경우되지 않습니다 : 여기서 문제는 operator==의 일반적인 정의는 것입니다.

연산자 오버로드가 아닌 표현이 뚜렷한 전통적인 함수를 사용하면 오해의 소지가 적어지는 것이 가장 좋습니다. mapstd::find을 사용하면 적절한 조건 자 개체를 전달할 수 있으므로 연산자를 과부하 할 필요가 없습니다.

+0

그러나'std :: find()'연산자는'std :: pair ::'에서'Key '단독으로 사용하지 않았습니다. 따라서 적절한 술어를 사용하는'std :: find_if()'가 사용되어야합니다. – sbi