[C++] Sort와 Priority Queue의 custom 함수

MTTW·2021년 2월 22일
2

C++

목록 보기
3/4

서론

algorithm::sort()의 custom 함수, 연산자 overriding은 여기에서 확인 가능하다.

sort에 이어 @kjh107704가 priority queue 연산자 overriding에 관련해서도 물어봤는데 사실 priority queue는 custom 함수를 만들어 사용한 적이 없었다.
+ 질문도 못 알아들었다. 당시에 많이 졸렸던 것으로 기억😴

그런데 오늘 @kjh107704의 글을 보다가 질문을 이해하고 추가적으로 글에 있는 질문도 찾아보다가 해결한 것 같아서 글을 써본다.

priority queue 사용법은 포스팅에 잘 설명되어 있으니 패-쓰

위에 나와있는 왜 operator()를 overriding 해야하는지 내가 이해하는 선에서 설명해보겠다. 사실 별 거 없다.


algorithm::sort()

algorithm::sort()는 마지막 parameter로 comp 함수를 요구한다. 또 공식 페이지에서는 < 연산자를 사용한다고도 소개하고 있다.

따라서 지난번 글에서 소개한 것 처럼 < 연산자 오버라이딩 또는 comp 함수를 이용해 원하는 정렬을 만들 수 있다.

priority_queue

반면 priority_queue는 ⭐object⭐를 요구한다. 즉 class 또는 struct가 필요하다. 이 때 객체 comp는 comp(a, b) 방식으로 사용되어 queue 내에 있는 두가지 element를 비교하고 a가 b보다 먼저와야 한다면 true를 리턴해야한다.

// 좌표 정보를 담는 구조체
struct pos {	
    int x;
    int y;
};

// x값을 우선적으로 비교하는 comp 객체
struct comp{
    bool operator()(pos p1, pos p2){
        if(p1.x == p2.x) return p1.y < p2.y;
        return p1.x < p2.x;
    }
};

int main(){
    ...
    priority_queue<pos, vector<pos>, comp> p_queue;
    ...
}

이쯤되면 드는 의문이 있다.

왜 sort는 함수를 쓰고 priority_queue는 객체를 써서 헷갈리게 만드는 걸까?
왜 굳이 객체에 연산자 오버라이딩을 써서 나를 힘들게 만드는가!!!

그건 priority_queue의 정렬 기준인 less functional이 bool operator()를 사용하고 있기 때문이다. 이걸 바꾸는 거라서 함수가 아니라 객체를 쓰는 것 같다.
물론 공식 페이지를 읽어보고 내가 판단한 결과일 뿐이다. 아닐 수도 있음 주의😜


operator() overriding

소괄호 오버라이딩은 처음인 것 같아 기억하기 위해 기록한다.
소괄호 오버라이딩을 하면 객체를 함수처럼 사용 가능하다.

위에서 봤겠지만 간단한 예시를 들어보겠다.

struct get_maximum{
    int maximum = 0;
    
    // get_maximum(num) 에서 괄호에 주어진 숫자가 저장된 maximum보다 크면 갱신되고 true 리턴
    bool operator()(int num){
    	if(num > maximum){
        	maximum = num;
            return true;
        }
        else return false;
    }
};

int main(){
    get_maximum(5);	// maximum = 5, return true
    get_maximum(3);	// maximum = 5, return false
    get_maximum(10);	// maximum = 10, return true
}

함수 이름을 하나의 함수처럼 쓰는 셈이다.


출처 : www.cplusplus.com


💬 주저리

나도 처음 알게된 내용이라 이해하고 재밌어서 갑자기 글을 써봤는데 이미 다 이해한 내용 혼자서 막 떠든게 아닌가 걱정이 된다.
질문의 의도와 다른 내용을 떠든거라면 글을 수정할 것 같다.
그래도 찾아보고 공부하면서 재밌었다.

Thanks to. 항상 재밌는 질문해주는 @kjh107704

끝🤟

profile
개발자가 되고 싶은 맽튜

1개의 댓글

comment-user-thumbnail
2021년 2월 23일

오 일리 있는 이해라고 생각합니다 감사감사 👏👏

답글 달기