본문 바로가기
컴퓨터/알고리즘

Sort에 사용하는 Compare 커스텀 + priority_queue 비교연산자 차이

by 우유식빵 2021. 11. 9.

주로 vector를 정렬할 때 sort를 사용하는데 

vector<int> 가 아니라 vector<struct~> vector<pair~> 같은 것을 사용하게 되는 경우

기본 오름차수 sort가 의도하는 대로 작동이 안되거나 그냥 작동이 안되기 때문에

커스텀으로 compare함수나 오브젝트를 만들어서 sort(v.begin(), v.end(), compare)로 사용할 필요가 있습니다.

 

https://www.cplusplus.com/reference/algorithm/sort/

 

sort - C++ Reference

custom (2)template void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

www.cplusplus.com

레퍼런스를 참고해보면 

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의 자리를 바꿔서 오름차순으로 정렬하게 됩니다.

 

https://www.cplusplus.com/reference/algorithm/sort/

레퍼런스를 보면 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에 오는 값 다르다는 것을 볼 수 있다.

댓글