본문 바로가기
C++/기초 및 알고리즘 함수

구조체 내부에서 연산자 오버로딩

by tokkiC 2022. 6. 9.

아래의 구문을 이해하기까지 꽤나 시간이 걸렸지만 이해한것이 있어 적어두고자 한다

bool operator < (const Point & a) const {         
    if (x == a.x) return y < a.y;            // 호출없이 쓰면 기존 구조체의 멤버
    return x < a.x;                            // a로 호출해서 쓰면 구조체 a의 멤버
}

operator < (기존 비교 연산자 <)를 새롭게 정의하는 코드이다.
연산자 < 의 왼쪽는 비교할 기존 (구조체 or 포인터)의 멤버를 놓는다
연산자 < 의 오른쪽은 비교할 외부 a (구조체 or 포인터)의 멤버를 놓는다
기존 구조체의 경우 a.x처럼 쓰지 않고 x로만 표현해도 기존 구조체의 멤버로 인식한다
즉, 기존 구조체 내부의 x 변수의 값과 비교하는 a구조체 내부의 x변수의 값이 같다면
기존 구조체 내부 y 변수의 값보다 a구조체 내부 y 변수의 값이 더 크다는 뜻이다
구조체끼리 x변수가 같은 경우가 아니면, a구조체의 x변수가 기존 구조체의 x변수보다 크다는 뜻이다

위 식의 경우 기존 포인터의 위치보다 새 포인터 a의 위치가 더 값이 오도록 나열할때 쓰인다 ex)오름차순 등등

struct Point {
    int y, x, z;
    Point (int y, int x, int z) : y(y), x(x), z(z) {}
    Point (){ y = -1; x = -1; z= -1; }
    bool operator < (const Point & a) const (
        if(x == a.x) {
            if (y == a.y) return z < a.z;
            return y > a.y;
         }
         return x < a.x;
    }
};

위 식의 경우는 x가 1순위로 오름차순, y가 2순위로 내림차순, z가 3순위로 오름차순 정렬이라는 것을 알 수 있다

댓글