Work/C++

구조체의 우선순위 큐 구현

sleepiggy 2010. 11. 19. 03:52
실습 과제를 하다가 만나게 된 문제
int를 구조체인자로 가지는 구조체의 우선순위 큐 구현

그러니까 우선순위 큐는 int 타입으로 넣으면 그 숫자의 오름차순 혹은 내림차순에 따라 차럐대로 정렬해 준다.
그런데, 어떤 번호를 가지는 사람들을 우선순위 큐에 넣어서 순서대로 출력하려면 어떻게 하면될까?


typedef struct Custom{ string name; int level; };

이런 구조체를 만들어서

priority_queue CustomPQ;

라고 선언을 하면 우선순위큐가 정의되지 않는다.
구조체의 어떤것을 비교해서 정렬해야 할지 모르기 때문이다.
그래서 이런 구조체를 우선순위큐에 사용하려면 어떻게 해야하나 구글 검색을 해 보니!

아래처럼 우선순위 큐 선언시 세번째 인자 즉 비교부분을 직접 정의해 주어 구현을 하는 것이였다.
template< typename FirstType, typename SecondType >
struct PairComparator{
bool operator()( const Custom& p1, const Custom& p2 ) const
{ if( p1.level < p2.level ) return true;
if( p2.level <= p1.level ) return false;
}
};
priority_queue, PairComparator > CustomPQ;


구현 중에 이해하기가 어려운 부분이 몇 가지 있었는데,이 것들은 곧 우선순위 큐에 대해 제대로 공부하면서 답을 해 보아야 겠다 Q) 세번째 인자가 구조체 인데 이 구조체가 들어오는 값들을 비교하는 역할을 하는 것 같은데 왜 구조체로 구현을 했는지, 이게 어떤 사이클로 돌아가는 것인가?

Q)구조체 안에 있는 bool operator() 라는 함수가 구조체 생성시 자동 호출되는 것인지 그럼 호출이 되어 bool 타입의 변수가 구조체의 멤버가 되는 것인가?

Q)우선순위큐는 push함수를 호출 해서 값이 들어올때마다 sorting 을 하여 정렬한 상태로 두고 pop 을 하는 것인가?
아니면 queue 처럼 그냥 쌓아둔 후에 pop 이나 top을 호출할때마다 제일 크거나 작은 수를 찾아서 return 시키는 것인가?

'Work > C++' 카테고리의 다른 글

vector 의 iterator 사용시 주의할 사항  (0) 2010.11.19
list 자료형  (0) 2010.11.03