upper_bound
https://www.cplusplus.com/reference/algorithm/upper_bound/?kw=upper_bound
upper_bound - C++ Reference
function template std::upper_bound default (1)template ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val); custom (2)template ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T
www.cplusplus.com
배열 (vector)에서 key 값을 초과하는 숫자가 몇 번째로 등장하는 지를 찾아준다. "초과"하는 숫자를 찾기 때문에 반환된 iterator가 가리키는 값이 key값이 아니다. (lower_bound와 다른 점)
전제조건은 배열이 오름차순으로 정렬되어 있어야 한다는 것이다.
1. default
template <class ForwardIterator, class T> ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val);
2. custom
template <class ForwardIterator, class T, class Compare> ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void){
vector<int> v = {3, 7, 8, 9, 1, 2, 4};
sort(v.begin(), v.end());
cout << upper_bound(v.begin(), v.end(), 4) - v.begin();
}
벡터 v 가 정렬되면 {1, 2, 3, 4, 7, 8, 9}가 될 것이고, key값인 4가 처음 등장하는 곳, 즉 v[3]의 주소를 반환할 것이다.
이 함수는 iterator을 반환하기 때문에 int 형식의 index를 찾고 싶다면 저렇게 벡터의 시작 주소를 빼줘야 한다.
lower_bound
https://www.cplusplus.com/reference/algorithm/lower_bound/?kw=lower_bound
lower_bound - C++ Reference
function template std::lower_bound default (1)template ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val); custom (2)template ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T
www.cplusplus.com
벡터를 탐색하면서 key값 보다 작지 않은 값이 처음으로 나오는 요소의 iterator를 반환한다
역시 벡터가 정렬되어 있어야 한다.
1. default
template <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);
2. custom
template <class ForwardIterator, class T, class Compare> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);
사용 방식은 upper_bound와 동일하다
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void){
vector<int> v = {3, 7, 8, 9, 1, 2, 4};
sort(v.begin(), v.end());
cout << lower_bound(v.begin(), v.end(), 4) - v.begin();
}
벡터 v 가 정렬되면 {1, 2, 3, 4, 7, 8, 9}가 될 것이고, key값인 4가 처음 등장하는 곳, 즉 v[3]의 주소를 반환할 것이다.
역시 인덱스를 얻고 싶다면 벡터의 시작 주소를 뺴줘야 한다.
'언어 > C&C++ 응용' 카테고리의 다른 글
[C++] 시간 초과 해결 (1) | 2021.09.18 |
---|---|
[C++] vector iterator, unique사용 (0) | 2021.09.11 |
[C] 정렬: qsort() (0) | 2021.09.07 |
[C++] std::sort() (0) | 2021.09.06 |
[C] 특수 입력 (0) | 2021.08.24 |