2014-12-25 7 views
-1

가 처음에 나는이처럼 보였다 코드를했다 해시 맵에 영향을 미칩니다. 이제 다음과 같은 코드가 있습니다.변경 표준 : : 쌍 유형은

std::map< std::pair<Vec3f, Vec3f>, std::vector<Class0*> > aMap; 

이 코드는 더 이상 제대로 매핑되지 않으며 (잘 컴파일 됨) 더 이상 매핑되지 않습니다. 왜? 어떻게 해결할 수 있습니까?

편집 :

class Vec3f { 
     ... 

     bool operator() (const Vector3f& v0, const Vector3f& v1) const { 

       return std::tie(v0[0], v0[1], v0[2]) < std::tie(v1[0], v1[1], v1[2]); 

    }  ... 

이 질문에 Overloading operator for set에서 : 인기 요구 한 후 여기에 3D 벡터의 비교 코드 (3 수레)입니다. 위의 비교는 한 세트에서 잘 작동하지만 분명히 한 쌍이 아닙니다. 왜?

+1

* "더 이상 제대로 매핑되지 않습니다 (잘 컴파일 됨)"* 자세히 설명해 주시겠습니까? 예상되고 관찰 된 행동은 무엇입니까? [MCVE] (http://stackoverflow.com/help/mcve)를 제공 할 수 있습니까? – dyp

+0

'Class1'에 올바른 복사 생성자가 있습니까? – Jarod42

+0

예를 들어 조금 더 자세하게 설명하면 도움이 될 것입니다. class1의 정의, 비교 연산자 및 정확히 "올바르게 매핑되지 않았습니다"라는 의미입니다. – MikeMB

답변

6

지도의 키는 쌍입니다. comparison of pair은 사전 편집자입니다. 먼저 두 쌍의 첫 번째 요소를 비교합니다. 둘 다 같으면 두 번째 요소를 비교합니다. 따라서 Class1Class에 대한 적절한 비교가 필요합니다.

추가 고려 사항 : 한 쌍의 각 클래스에

map comparator 덜보다 몇 가지 제약 조건을 준수해야합니다 : 그것은 모든 요소 사이에 stritct 약한 oredering을 설정해야합니다

  • .
  • (! k1<k2) && (! k2<k1)k1==k2
  • k1<k2 && k2<k3에 해당이 속성 중 하나가 끊어지면 k1<k3

이 엄격한 순서가 보장되지 않으므로 매핑이 실패 할 수 있음을 의미한다.

+0

OP는 오타를 수정했습니다 : 'Class'는없고'Class1 '만 있습니다. – Jarod42