1. < 를 오버로딩 하는 방법

algorithm 헤더에 정의돼 있는 sort() 펑션은 < 로 정렬한다. 즉 < 를 오버로딩 해주면 된다.

struct edge{
    int value;

    bool operator <(const edge &b) const{
        return this->value < b.value;
    }
};
위 처럼 하면 edge e가 안의 value값으로 정렬 가능하다.

edge e[100];
e[0].value = 10;
e[1].value = 110;
e[2].value = 150;
e[3].value = 160;
e[4].value = 30;
e[5].value = 40;
e[6].value = 60;
e[7].value = 50;
e[8].value = 40;
e[9].value = 180;
sort(e,e+10);
for(int i = 0;i < 10;i++)
{
    std::printf("%d\n",e[i].value);
}


2. sort()의 세번째 인자에 술어(predication)을 지정하는 방법

struct edge{
    int value;
};

struct comp{
    bool operator()(const edge &lhs, const edge &rhs){
        return lhs.value < rhs.value;
    }
};
로 ()를 오버로딩 하면 된다. 위 처럼 괄호 연산자를 오버로딩 하면
comp c;
c(a,b); 라고 마치 함수처럼 쓸 수 있다.
sort의 원형을 보면 (공부 하고 싶으면 당장 sort 함수의 원형에 go to 할 것!! 눈으로 보면 이해하기 힘듬)
template<class _RanIt,
    class _Pr> inline
    void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)
이와 같이 생겼으며 더 자세히 들어가면
template<class _RanIt,
    class _Diff,
    class _Pr> inline
    void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal, _Pr _Pred)
로 생겼다. 더 파고 들어가보면 Pred를 계속해서 안으로 넣어주는걸 볼 수 있다. 이번엔 여기서 사용된다.
pair<_RanIt, _RanIt> _Mid =
            std::_Unguarded_partition(_First, _Last, _Pred);
이번엔 랜덤 이터레이터의 페어를 리턴하는 _Unguarded_partition으로 Pred를 넘겨준다.
도대체 Pred는 언제 사용 되는 것인가아아아
하나만 더 들어가 보면 답이 나온다.
!_Pred(*_Pfirst, *(_Pfirst - 1))
이런 부분이 있다. Pred는 괄호와 함께 쓰이는 구나,
!_Pred(*_Pfirst, *(_Pfirst - 1)) 가 뭔지는 내가 정의해준 술어에 따라 다르다.
위 프로그램에선 내가 술어를
struct comp{
    bool operator()(const edge &lhs, const edge &rhs){
        return lhs.value < rhs.value;
    }
};
로 지정해 줬기 때문에 rhs.value가 더 크면 _Pred는 참인 것이다.
좀더 정확히 설명하면 사이즈가 작을 땐 인설트 소트를 사이즈가 클 땐 힙소트를 하는데 그냥 대충 Pred를 이런 식으로 사용한 다 식으로만 보면 되겠다.

사용은 다음과 같이 한다

    comp c;
    edge e[100];
    e[0].value = 10;
    e[1].value = 110;
    e[2].value = 150;
    e[3].value = 160;
    e[4].value = 30;
    e[5].value = 40;
    e[6].value = 60;
    e[7].value = 50;
    e[8].value = 40;
    e[9].value = 180;
   
    std::sort(e,e+10,c);
   
    for(int i = 0;i < 10;i++)
    {
        std::printf("%d\n",e[i].value);
    }

std::sort(e,e+10,c); 이 부분을 명시적 생성자 호출인
std::sort(e,e+10,comp()); 로 해줘도 된다. (자바의 new comp()랑 비슷하다고 생각하믄 된다.)
저작자 표시 비영리 변경 금지
신고
블로그 이미지

roter

JHB / Peripheral Programmer

댓글을 달아 주세요