포스트

구조체 struct 2

이 글은 제 개인적인 공부를 위해 작성한 글입니다.
틀린 내용이 있을 수 있고, 피드백은 환영합니다.


개요


1
2
3
4
5
6
7
struct Person {
    string name;
    int age;
};

// 이렇게 하면 에러 발생!
priority_queue<Person> pq;

C++에서 우선순위 큐의 원소로 구조체를 사용할 경우, 아래와 같은 에러가 발생할 수 있다.

1
Error C2676 : 이항 '<': 'const _Ty'이(가) 이 연산자를 정의하지 않거나 미리 정의된 연산자에 허용되는 형식으로의 변환을 정의하지 않습니다.

이유는 크게 두 가지가 있는데,

  1. 기본 비교 연산자 부재
    • C++은 구조체에 대해 자동으로 비교 연산자를 생성하지 않는다.
    • 우선순위 큐는 내부적으로 operator<를 사용하여 원소들을 정렬한다.
    • 사용자 정의 구조체는 이 연산자가 정의되어 있지 않으므로 컴파일 에러가 발생한다.
  2. 모호한 비교 기준
    • 구조체에 여러 멤버 변수가 있을 때 어떤 기준으로 비교해야 할지 컴파일러가 알 수 없다.
    • Person 구조체의 name으로 비교할 지, age로 비교할 지 명확하지 않다.

이를 해결하기 위해 구조체 내부에 연산자를 정의하거나, 별도의 비교 클래스를 정의할 수 있다.


구조체 내부에 연산자 정의


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Character {
    string name;
    int level;
    int hp;

    Character(string n, int l, int h) : name(n), level(l), hp(h) {}

    bool operator<(const Character& other) const {
        if (level != other.level) {
            return level < other.level;
        }
        return hp < other.hp;
    }
};

priority_queue<Character> characterPq;

구조체 내부에 연산자 오버로딩을 정의하여, Character라는 구조체를 비교할 때 level이 높은 순서대로 정렬하고 level이 같다면 hp가 높은 순서대로 정렬할 수 있다.


구조체 외부에 비교 함수 구조체 정의


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Character {
    string name;
    int level;
    int hp;

    Character(string n, int l, int h) : name(n), level(l), hp(h) {}
};

struct CompareCharacter {
    bool operator()(const Character& a, const Character& b) const {
        if (a.level != b.level) {
            return a.level < b.level;
        }
        return a.hp < b.hp;
    }
};

priority_queue<Character, vector<Character>, CompareCharacter> characterPq;

위 코드처럼 별도의 비교 함수 구조체를 정의하고, 우선순위 큐 선언 시에 세 번째 인자로 전달할 수 있다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.