구조체 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'이(가) 이 연산자를 정의하지 않거나 미리 정의된 연산자에 허용되는 형식으로의 변환을 정의하지 않습니다.
이유는 크게 두 가지가 있는데,
- 기본 비교 연산자 부재
- C++은 구조체에 대해 자동으로 비교 연산자를 생성하지 않는다.
- 우선순위 큐는 내부적으로
operator<
를 사용하여 원소들을 정렬한다. - 사용자 정의 구조체는 이 연산자가 정의되어 있지 않으므로 컴파일 에러가 발생한다.
- 모호한 비교 기준
- 구조체에 여러 멤버 변수가 있을 때 어떤 기준으로 비교해야 할지 컴파일러가 알 수 없다.
- 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 라이센스를 따릅니다.