lower_bound 및 upper_bound는 내장된 이진 검색 기능입니다.
lower_bound - 대수 시간에서 주어진 값 k보다 크거나 같은 정렬된 배열에서 가장 작은 요소를 찾는 함수입니다.
배열의 범위와 k 값을 인수로 사용합니다.
발견된 요소 또는 그러한 요소가 존재하지 않는 경우 배열의 끝(포함되지 않음)에 대한 반복자를 반환합니다.
문서에서 자세한 내용을 확인할 수 있습니다.
upper_bound - 정렬된 배열의 대수 시간에서 주어진 값 k보다 엄격하게 큰 가장 작은 요소를 찾는 함수입니다.
배열의 범위와 k 값을 인수로 사용합니다.
발견된 요소 또는 그러한 요소가 존재하지 않는 경우 배열의 끝(포함되지 않음)에 대한 반복자를 반환합니다.
문서에서 자세한 내용을 확인할 수 있습니다.
위의 랜덤 액세스 컬렉션에 반복자가 없기 때문에 집합 또는 다중 집합에서 이러한 함수를 사용하는 것이 대수 시간에 작동하지 않는다는 점을 명확히 할 가치가 있습니다.
그러나 이러한 컬렉션에는 해당 내장 메서드가 있습니다(즉, "점을 통해" 사용해야 함).
예:
벡터 a = { 0, 1, 3, 5, 7 };
vector::iterator it;
it = lower_bound(a.begin(), a.end(), 4);
// *it == 5
it = lower_bound(a.begin(), a.end(), 5);
// *it == 5
it = lower_bound(a.begin(), a.end(), 8);
// 그것 == a.end()
it = upper_bound(a.begin(), a.end(), 4);
// *it == 5
it = upper_bound(a.begin(), a.end(), 5);
// *it == 7
it = upper_bound(a.begin(), a.end(), -1);
// *it == 0
// 반복자를 빼면 찾은 요소의 인덱스를 얻을 수 있습니다.
int ind = lower_bound(a.begin(), a.end(), 4) - a.begin();
// 인더 == 3
// set 및 유사한 컬렉션에 대해 함수 대신 메서드를 사용해야 합니다.
set s{ 1, 3, 5 };
set::iterator 앉아;
앉아 = s.lower_bound(3);
// *앉아 == 3
앉아 = s.upper_bound(3);
// *앉아 == 5