Programming/c++

[c++] priority_queue

owls 2023. 2. 12. 14:11
728x90

c++에서 priority_queue는 max heap 개념입니다. 가장 큰 요소가 항상 맨 위 위치에 있도록 해당 요소를 정렬합니다.

항상 가장 크거나 우선 순위가 가장 높은 일부 기본 컨테이너 형식의 최상위 요소에 대한 액세스를 제한하는 기능 제한을 제공하는 템플릿 컨테이너 어댑터 클래스입니다. 새 요소를 추가할 priority_queue 수 있으며 해당 요소의 priority_queue 최상위 요소를 검사하거나 제거할 수 있습니다.

 

1. 클래스 헤더 파일

#include <queue>

2.클래스 원형

template <class Type, class Container= vector <Type>, class Compare= less <typename Container ::value_type>>
class priority_queue
priority_queue <T,vector<T>,compare> pq;    // T : 구조체

3. Parameter (매개 변수)

Type priority_queue에 저장되는 요소 데이터 형식
Container priority_queue를 구현하는데 사용되는 기본 컨테이너의 형식
Compare 두 요소 값을 정렬 키로 비교하여 해당 요소의 상대 순서를 확인할 수 있는 함수 개체를 제공하는 형식.
이 인수는 선택 사항.
기본 값은 이진 조건자 less<typename Container::value_type> 

 

 

4. Member Function

멤버 함수 Description
empty priority_queue 가 비어 있는지 확인(테스트)합니다.
pop 가장 큰 요소를 최상위 위치를 제거합니다.
push "operator<"에서 요소의 우선 순위에 따라 우선 순위 큐에 요소를 추가합니다.
size priority_queue 에 있는 요소 수를 반환합니다.
top priority_queue의 최상위 위치에 있는 가장 큰 요소에 대한 const 참조를 반환합니다.

 

5. Example

(1)

	priority_queue<int, deque<int>> pq;

	pq.push(5);
	pq.push(15);
	pq.push(10);

	while (!pq.empty())
	{
		cout << pq.top() << " ";
		pq.pop();
	}
15 10 5

(2)

	priority_queue<int, vector<int>, greater<int> > pq;

	pq.push(5);
	pq.push(15);
	pq.push(10);

	while (!pq.empty())
	{
		cout << pq.top() << " ";
		pq.pop();
	}
5 10 15

(3)

	priority_queue<int> pq;

	pq.push(5);
	pq.push(15);
	pq.push(10);

	priority_queue<int> pq2(pq);

	while (!pq2.empty())
	{
		cout << pq2.top() << " ";
		pq2.pop();
	}
15 10 5

(4)

priority_queue는 기본으로 내림차순 정렬입니다. 

나이 내림차순, 나이가 같다면 알파벳 내림차순으로 정렬하도록 compare함수를 정의합니다.

using namespace std;

struct Person {
	int age;
	string name;
	Person(int a, string b) : age(a), name(b) {}
	bool operator<(const Person& b)const {
		if (age == b.age) {
			return name < b.name;
		}
		return age < b.age;
	}
};

int main(int argc, char** argv)
{
	priority_queue<Person> pq;

	pq.push(Person(20, "AAB"));
	pq.push(Person(15, "BCD"));
	pq.push(Person(15, "ABC"));
	pq.push(Person(20, "AAC"));
	pq.push(Person(20, "AAA"));
	
	while (!pq.empty())
	{
		auto& [n, str] = pq.top();
		cout << n << " " << str << endl;
		pq.pop();
	}

	return 0;
}
20 AAC
20 AAB
20 AAA
15 BCD
15 ABC

compare구조체를 새로 만들어서 하는 방법입니다.

struct Person {
	int age;
	string name;
};

struct cmp {
	bool operator()(Person& a, Person& b) {
		if (a.age != b.age) {
			return a.age < b.age;
		}
		return a.name < b.name;
	}
};

 

728x90