관리 메뉴

기억을 위한 기록들

[C++/STL] 우선순위 큐(priority_queue) 관련 본문

C & CPP/STL(Standart Template Library

[C++/STL] 우선순위 큐(priority_queue) 관련

에드윈H 2021. 1. 24. 17:21

0. 기본 우선순위는 less (내림차순 높은값이 루트값)

#include<iostream>
#include<vector>
#include<queue>

using namespace std;
int main() {

	//priority_queue<자료형,컨테이너 타입,우선순위> 

	//아무것도 입력하지 않으면 기본 정렬은 less
	priority_queue<int> pq;


	pq.push(4); //원소 추가 push
	pq.push(20);
	pq.push(3);
	pq.push(9);
	pq.push(1);


	pq.pop();//원소 제거 // 가장 높은 수인 20 제거 됨

	cout <<"루트 값은 : "<< pq.top() << '\n';//가장 위에 있는 원소 반환


	if (!pq.empty()) //비어 있는지 여부
	{
		cout <<"크기는 : "<< pq.size() << '\n';//크기 반환
	}

	return 0;
}

 

 

1.우선 순위 less (내림차순, 가장 높은값이 루트값)

#include<iostream>
#include<vector>
#include<queue>

using namespace std;
int main(){

	//priority_queue<자료형,컨테이너 타입,우선순위> 
	priority_queue<int, vector<int>, less<int>> pq;


	pq.push(4); //원소 추가 push
	pq.push(20);
	pq.push(3);
	pq.push(9);
	pq.push(1);


	pq.pop();//원소 제거 // 가장 높은 수인 20 제거 됨

	cout <<"루트 값은 : "<< pq.top() << '\n';//가장 위에 있는 원소 반환


	if (!pq.empty()) //비어 있는지 여부
	{
		cout <<"크기는 : "<< pq.size() << '\n';//크기 반환
	}

	return 0;
}

 

 

 

 

2.우선 순위 greater (오름차순, 가장 낮은 값이 루트값)

#include<iostream>
#include<vector>
#include<queue>

using namespace std;
int main(){

	//priority_queue<자료형,컨테이너 타입,우선순위> 
	priority_queue<int, vector<int>, greater<int>> pq; //less 대신 greater


	pq.push(4); //원소 추가 push
	pq.push(20);
	pq.push(3);
	pq.push(9);
	pq.push(1);


	pq.pop();//원소 제거 // 가장 낮은 수인 1 제거 됨

	cout<<pq.top()<<'\n';//원소 반환


	if (!pq.empty()) //비어 있는지 여부
	{
		cout << pq.size() << '\n';//크기 반환
	}

	return 0;
}

 

3. 임의의 연산자 오버로딩 응용

#include<iostream>
#include<vector>
#include<queue>
using namespace std;

struct Location {

	Location(int _x, int _y)
	{
		mX = _x;
		mY = _y;
	}
	int mX;
	int mY;

	bool operator<(const Location &target) const {
		return target.mX > mX;
	}
};
int main(){
	//priority_queue<자료형,컨테이너 타입,우선순위> 
	priority_queue<Location> pq; 

	pq.push(Location(45, 20));  //18번줄로 인해 x값이 더 큰게 루트로가는 push
	pq.push(Location(4,2));
	pq.push(Location(6, 10));
	pq.push(Location(9, 15));



	pq.pop();//원소 제거 // 가장 큰수인 45,20 제거

	cout <<"루트값은 : "<< pq.top().mX<<", "<<pq.top().mY << endl;;


	if (!pq.empty()) //비어 있는지 여부
	{
		cout << pq.size() << '\n';//크기 반환
	}

	return 0;
}

출력 결과