2012-01-05 2 views
8

은 다음 줄이 find와는 달리 end_iterval에 대한 lower_bound의 반환 값을 테스트 할 수는 없습니다. "시험 LOWER_BOUND의 반환 값 반복자

왜 이럴 수 없습니까? 나를 위해 잘 작동하는 것 같습니다.

+0

책에서 그 시점의 컨텍스트는 무엇입니까? 이 책이 무엇을 말하고 있는지 알지 못하면 혼란 스럽습니다. 값이 집합에 포함되어 있는지 확인하기 위해'lower_bound '를 사용한다고 말하는 것입니까? – Justin

답변

9

요소가 있기 때문에 잘 작동합니다.

lower_bound 첫번째 요소 소정 값 이상인 반복자 반환하고 upper_bound 첫번째 요소 주어진 값보다 큰 반복자를 반환한다.

  • 사용 equal_rangeupper_bound (컴퓨팅 얻을 : 배열 1, 2, 3, 3, 4, 6, 7 주어

    , lower_bound(..., 5) 그러므로 제

    값이 존재하는지 여부를 검사하는 방법은 두 가지 가리키는 반복자를 반환 개별적으로 lower_boundupper_bound은 아마도 차선책입니다. 범위 사이의 std::distance이 0보다 크면 요소가 나타납니다.

    1, 2, 3, 3, 4, 6, 7 
    std::distance(std::lower_bound(v.begin(),v.end(),5), std::upper_bound(v.begin(),v.end(),5)) == 0 // 6 is absent 
    std::distance(std::lower_bound(v.begin(),v.end(),3), std::upper_bound(v.begin(),v.end(),3)) == 2 // 3 is present 
    
  • 은 (!=<가 일관성있는 연산자를 제공하는) 당신의 값이 반복자가 가리키는 요소를 비교,하지만 당신은 끝 반복자를 반환하지 않도록해야합니다. lower_bound 이후 또한

*(std::lower_bound(v.begin(), v.end(), 5)) != 5 

는 요소가 발견되지 않는 경우가 end를 반환 일치하지 않아 이진 검색 알고리즘이다. 실제로,이 알고리즘에 의해 리턴 된 이터레이터는 예를 들어 후속 삽입 조작을위한 힌트로 사용될 수 있습니다.

+0

+1 : 그러나 마이어스 (Meyers)는 그 책에서 평등을 비교하는 것이 항상 효과가있는 것은 아니기 때문에 (lower_bound는'== '이 아니라'<'를 사용하기 때문에) –

+0

@Oli Charlesworth : 만약 당신이'<'를 오버라이드한다면 당신은 아마'=='을 오버라이드해야합니다. 적응 된 대답. – Benoit

+2

여러분이 그렇게하더라도 반드시 일치 할 필요는 없습니다 :'=='는 "동등", "<"는 "동등"입니다. 이것에 대한 논의는 Effective STL의 Item 19를 참조하십시오. –