set 자료구조나 lower_bound(), upper_bound() 함수에 사용자 정의 타입을 사용하기 위해서는 < 연산자를 오버로드 해주어야 한다.
- 하지만, 각 경우에 따라 오버로드 함수의 시그니처가 다르다.
struct Item
{
int data;
// set
friend bool operator < (const Item& A, const Item& B) { return A.data < B.data; }
// lower_bound
friend bool operator < (const Item& left, int right) { return left.data < right; }
// upper_bound
friend bool operator < (int left, const Item& right) { return left < right.data; }
};
Item을 data에 따라 정렬하여 set에 저장하고, vector로 변환하여 lower_bound()와 upper_bound() 함수를 사용하는 예시다.
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
void main()
{
set<Item> st;
st.insert({1});
st.insert({10});
st.insert({100});
st.insert({1000});
vector<Item> v(st.begin(), st.end());
int index = lower_bound(v.begin(), v.end(), 10) - v.begin();
cout << "[" << index << "] " << v[index].data << endl;
index = upper_bound(v.begin(), v.end(), 10) - v.begin();
cout << "[" << index << "] " << v[index].data << endl;
}
출력
[1] 10
[2] 100
'자료구조 & 알고리즘 > 기타' 카테고리의 다른 글
DFS로 조합, 순열 만들기 (0) | 2023.09.13 |
---|---|
우선순위 큐 사용시 비교기 정의가 기억나지 않을 때 (0) | 2023.07.25 |
탐색 시 범위 검사를 좀 더 간단하게 하는 방법 (0) | 2023.07.10 |
map에서 키 존재 여부를 확인할 때 주의할 점 (0) | 2023.07.08 |
1차원 벡터를 2차원 벡터로 변환 (0) | 2023.05.26 |