나는 모든 비교 연산자를 오버로드하는 클래스가 있습니다. 나는이 객체들의 묶음을 키로지도에 적재하고지도가 가장 큰 것부터 가장 큰 것까지 정렬 할 것으로 기대한다.C++ std :: map 키 정렬 비교 함수?
그러나지도는 실제로 가장 큰 것부터 가장 작은 것까지 정렬됩니다. 왜 이런거야? 지도를 정렬 할 때 키에 비교 연산자를 사용하지 않습니까? 어떻게해야할까요?
는나는 모든 비교 연산자를 오버로드하는 클래스가 있습니다. 나는이 객체들의 묶음을 키로지도에 적재하고지도가 가장 큰 것부터 가장 큰 것까지 정렬 할 것으로 기대한다.C++ std :: map 키 정렬 비교 함수?
그러나지도는 실제로 가장 큰 것부터 가장 작은 것까지 정렬됩니다. 왜 이런거야? 지도를 정렬 할 때 키에 비교 연산자를 사용하지 않습니까? 어떻게해야할까요?
는당신이 표준 : :지도에 대한 정의를 보면은, 3 매개 변수는 비교입니다 - 기본적으로 std::less< Key >
을. 기본 구현은 operator<
을 호출하는 것입니다.
당신은 YourType
은과 같이, 정의 된 헤더에 새 버전을 정의하는 시도 할 수 :
template<> std::less<YourType>
{
bool operator()(
const YourType& lhs,
const YourType& rhs)
{
if(!(lhs.member1 < rhs.member1))
{
return false;
}
if(!(lhs.member2 < rhs.member2))
{
return false;
}
return true;
}
}
이 수업 시간에 친구
std::less< YourType >
해야합니다.
실제 테스트는 다음을 준수해야합니다 또는 당신이 모든 문제의 종류 얻을 것이다 : = false를
(나는 최근에 발견 한) 중요한 점은 컴파일러가 당신이 의미를 재정의했다는 불평을하기 시작하면 std::less
또는 다른 펑키 물건 일 경우 사용자가 std::map< YourType >
을 신고했을 때 전달한 사람이 YourType
인 것으로 나타났습니다.
희망이 도움이됩니다.
:
bool operator < (T lhs, T rhs) const
{
return rhs < lhs; // note: lhs is on the right!
}
이
귀하의 문제는 단순한 오타 일 수 (나는 한 번 그했다) 실제로 당신이 원하는 :
bool operator < (T lhs, T rhs) const
{
return lhs < rhs;
}
코드를 게시하십시오. 코드를 보지 않고 대답 할 수 없습니다. –
'std :: map'은 기본적으로'operator <'를 사용합니다. 'operator <'의 구현이 거꾸로되어 있지 않습니까? – jamesdlin
주문을 어떻게 점검하고 있습니까? 예상 된 주문을 손으로 확인할 수 있습니까? 예 : 'cout << obj1 << ""<< obj2 << "는"<< boolalpha << (obj1