2011-02-10 4 views
0

나는 단순히 문자열과 double을 포함하는 구조체 (예 : Foo)를 가지고 있으며 이러한 속성의 하위 집합을 비교하는 비교기 클래스도있는 집합을 만들었습니다. std::set<Foo, FooComp>집합 조회의 정확한 비교

내가 find() 내가 Foo의 모든 속성을 기대하는 전화 키로서 사용하거나 FooComp 사용되는 : 그래서 내 선언처럼 보인다? 나는 이전을 추측하고있다.

내가 묻는 이유는 이전에 추가 된 개체가 집합에서 발견되지 않는데 그 이유는 find()을 사용하여 해당 개체의 존재 여부를 확인하려고했기 때문입니다. 아마 더블에서 미묘한 차이가 있었기 때문에 이런 일이 일어났다 고 추측 할 수 있습니까? double 속성은 비교 자에서 사용되지 않지만 아마도 키의 일부를 형성합니다.

의견을 보내 주시면 감사하겠습니다.

+2

너의 머리에 종. – Simone

답변

1

std::set::find()FooComp을 사용합니다. 두 배가 해당 비교의 일부가되지 않는 한 괜찮습니다.

std::findoperator== 필요하므로 다시이 무엇을 그만큼이 두 번을 포함하지 않는 한, 포함 (또는 합리적인 방법으로 두 번 포함)를 정의했다면, 당신은 좋은거야 따라 달라집니다.

그래서, FooComp의 모습을 따라 당신이 부르는 find ... 나는 double` 항상 반지해야 실제로 ... 어쨌든, "정확한 비교 '와`코드를 보지 않고 대답하기는 어렵습니다 생각

+0

구별을 지적 해 주셔서 감사합니다.그것은 내가 찾고있는 set'find()'이고, 모든 응답에서 영감을 얻은 약간의 시행 착오 끝에, 문제는 Comparitor 함수 연산자의 문제가있는 구현으로 드러났습니다. 모두에게 감사드립니다. –

1

비교기는 세트의 지정된 항목을 찾는 데 사용됩니다.

2

FooComp는 Foo에 대한 2 개의 참조를 취하고 왼쪽 하나가 논리적으로 올바른 것보다 작은 지 여부를 결정하는 이진 함수를 나타낼 필요가 있습니다. 따라서 "엄격한 순서"

  • !FooComp(foo1, foo1)
  • FooComp(foo1, foo2) =>!FooComp(foo2, foo1)
  • FooComp(foo1, foo2) & & FooComp(foo2, foo3) =>FooComp(foo1, foo3)
,745와

struct FooComp 
{ 
    bool operator()(const Foo& left, const Foo& right) const; 
}; 

구현할 연산자()

실제로 첫 번째 공리를 두 번째 공리로부터 추론 할 수 있으므로 두 번째 공리와 세 번째 공리 만 필요합니다.

+2

그것은 만족해야만하는 하나의 공리입니다. 'FooComp'는 엄격한 약한 순서가되어야합니다. 즉, 역 반사 ('! FooComp (x, x)'), 불균형 ('FooComp (x, y)'는'! FooComp (y, x)') 및 동등성 (transitivity, irreflexivity 및 antisymmetry에 의해) transitive이어야합니다. https://secure.wikimedia.org/wikipedia/ko/wiki/Strict_weak_ordering –

+0

역 반사는 반 대칭에서 추론 할 수 있습니다. – CashCow

1

비교 클래스는 set을 정렬하고 find()으로 유지하는 데 사용됩니다.