주로 vector를 정렬할 때 sort를 사용하는데
vector<int> 가 아니라 vector<struct~> vector<pair~> 같은 것을 사용하게 되는 경우
기본 오름차수 sort가 의도하는 대로 작동이 안되거나 그냥 작동이 안되기 때문에
커스텀으로 compare함수나 오브젝트를 만들어서 sort(v.begin(), v.end(), compare)로 사용할 필요가 있습니다.
https://www.cplusplus.com/reference/algorithm/sort/
레퍼런스를 참고해보면
sort(first, last, comp)로 사용할 때
comp는
comp가 bool로 반환 값을 던져주는데
comp에 따라서 first와 last의 순서가 결정된다 ~ 이렇게 적혀있습니다.
또 comp는 함수 포인터도 되고 함수 오브젝트도 된다고 적혀있습니다.
comp에서 bool값이 참으로 반환된다면
first와 last의 순서를 바꾸지 않습니다.
하지만 comp에서 bool값이 거짓으로 반환되면
first와 last의 순서를 바꿉니다.
그래서 예를 들어
bool compare(int first, int last){
return first<last;
}
와 같은 경우, first가 last보다 작으면 그대로 두지만
first가 last보다 커서 false를 반환하는 경우
first와 last의 자리를 바꿔서 오름차순으로 정렬하게 됩니다.
레퍼런스를 보면 struct내에서 operator로 만든 함수 오브젝트도 사용가능하고
myfunction이라는 함수 포인터도 comp로 이용가능한 것을 볼 수 있습니다.
맨날 문제 풀 때마다
comp함수 만들 때
return 조건문을 뭐로해야하는지 헷갈려서 적었습니다.
추가.
priority_queue를 이용할 때 비교연산자를 커스텀해서 사용하고싶다면
struct compare{
bool operator()(pair<int,int> a, pair<int,int> b){
return a.second < b.second;
}
}
이렇게 struct로 이용할 수 있는데
이때 compare가 true이면 sort와 달리 swap을 한다. (반대)
그래서 같은 compare struct 비교연산자를 각각
vector sort와 prioirty_queue에 적용시켜보았을 때
vector의 가장 앞에오는 값과 priority_queue의 top에 오는 값 다르다는 것을 볼 수 있다.
'컴퓨터 > 알고리즘' 카테고리의 다른 글
Bubble Sort - 거품 정렬과 코드 (0) | 2022.07.05 |
---|---|
새내기 자료구조 멘토링 - Stack,Queue,Tree,Graph (0) | 2021.11.14 |
깃허브를 이용한 알고리즘 스터디 하는법 (16) | 2021.10.24 |
[c++] 이중 벡터 초기화 선언하고 사용하기 (0) | 2021.09.12 |
알고리즘(코테) 스터디 [포도농사] 파일 공유 및 사용법 (4) | 2021.08.26 |
댓글