HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • 프로그래머스Python
  • 백준Go
  • Baekjoon Online Judge
  • 프로그래머스C++
  • 백준
  • back-end
  • 백준C++
  • 프로그래머스
  • 알고스팟Python
  • 백준Python
  • 데이터베이스
  • 백엔드
  • front-end
  • 프로그래밍
  • 알고스팟
  • programmers
  • 코딩
  • Algospot
  • 개발자
  • Database

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[C++] priority_queue 사용법
Deprecated

[C++] priority_queue 사용법

2020. 4. 26. 19:14

© Copyright 2020 Standard C++ Foundation. All rights reserved.

[C++] priority_queue 사용법

(글쓴날 : 2020.04.26)

 


* 이 글은 글쓴이가 공부한 내용을 정리하며 올리는 글입니다.


 

 

C++ priority_queue 사용법


1) priority_queue란?

priority_queue란 자료구조 queue의 일종으로 <queue> 헤더에 존재합니다.

priority_queue는 queue와 똑같이 추가(push), 삭제(pop) 등의 기능을 하며, 일반 queue와 달리 우선순위를 기준으로 수행하는 것이 특징입니다.

보통, 우선순위를 선정하기 위해 내부적으로 heap 자료구조를 사용하며, 그에 따라 추가(push) 및 삭제(pop) 시 O(log n)의 시간 복잡도가 걸리게 됩니다.

 

또한, 우선순위 설정을 위해 보통 <functional> 헤더의 greater<>, less<> STL을 사용하며, 만약, 사용자 정의 우선순위 설정이 필요하다면 operator()를 추가로 구현하여 사용합니다.

(아무 우선순위도 설정하지 않을 시, 내림차순(MaxHeap) 우선순위로 설정됩니다.)


2) priority_queue 사용법

(1) <queue> 헤더 include 및 표준 네임스페이스 사용 선언

1
2
#include <queue>
using namespace std;

(2) priority_queue 생성(기본)

기본 생성 방법은

priority_queue<(type)> 이름;

입니다.

(기본으로 생성할 시, 내림차순(Max Heap)으로 구현됩니다.)

ex)

1
priority_queue<int> pq1;

(3) Priority_queue 생성(우선순위 설정)

우선순위 설정 방법은

priority_queue<(type), vector<(type)>, (우선순위 기준)> 이름;

이며,

기본 생성 제네릭 매개변수에 vector<(type)>, (우선순위 기준) 두 가지 인자를 추가로 overload 해주면 됩니다.

이 예시에서는, 오름차순(Min Heap) 우선순위 구현을 위해 <functional> 헤더의 greater<>를 우선순위 기준으로 사용했습니다.

ex)

1
priority_queue<int, vector<int>, greater<int>> pq2;

(4) .push(), .size() : 값 추가(push) 및 사이즈(size) 확인

일반적인 queue와 마찬가지로 push() 함수를 이용해 값을 추가해 주시고, size() 함수를 이용해 사이즈를 확인해 주시면 됩니다.

ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// priority_queue<int> pq1; (내림차순)
pq1.push(1);
cout << pq1.size() << endl;    // cout결과 : 1
pq1.push(2);
cout << pq1.size() << endl;    // cout결과 : 2
pq1.push(3);
cout << pq1.size() << endl;    // cout결과 : 3
 
// priority_queue<int, vector<int>, greater<int>> pq2; (오름차순)
pq2.push(1);
cout << pq2.size() << endl;    // cout결과 : 1
pq2.push(2);
cout << pq2.size() << endl;    // cout결과 : 2
pq2.push(3);
cout << pq2.size() << endl;    // cout결과 : 3

(5) .top(), .pop() : 우선순위가 제일 높은 값 확인(top) 및 삭제(pop)

일반적인 큐와 마찬가지로 top() 함수와 pop() 함수를 사용해 주시면 되지만, priority_queue의 경우 저장되어 있는 값 중 설정한 우선순위가 제일 높은 순으로 수행됩니다.

ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// priority_queue<int> pq1; (내림차순)
cout << pq1.top() << endl;    // cout결과 : 3
pq1.pop();
cout << pq1.top() << endl;    // cout결과 : 2
pq1.pop();
cout << pq1.top() << endl;    // cout결과 : 1
pq1.pop();
 
// priority_queue<int, vector<int>, greater<int>> pq2; (오름차순)
cout << pq2.top() << endl;    // cout결과 : 1
pq2.pop();
cout << pq2.top() << endl;    // cout결과 : 2
pq2.pop();
cout << pq2.top() << endl;    // cout결과 : 3
pq2.pop();

(6) .empty() : 우선순위 큐가 비어있는지 확인

마찬가지로, 일반적인 큐처럼 empty() 함수를 사용해 주시면 되겠습니다.

ex)

1
2
3
4
cout << pq1.empty() << endl;  // cout결과 : 1(true)
 
pq2.push(1);
cout << pq2.empty() << endl;  // cout결과 : 0(false)

(7) 사용자 정의 우선순위 설정

사용자 정의 우선순위 설정은 operater()를 추가로 구현하여, 연산자 오버로딩을 통해 설정합니다.

operater() 인자의 첫 번째에 비교할 기존 값, 두 번째에 새로 추가할 값을 지정하여 원하는 우선순위가 true를 반환하도록 재정의 해주시면 됩니다.

다음은, 오름차순(Min Heap) 우선순위를 설정하는 예시입니다.

ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <queue>
#include <vector>
 
using namespace std;
 
struct prio {
    bool operator()(int oldValue, int newValue) {
        return oldValue > newValue;
    }
};
 
int main(void) {
    priority_queue<int, vector<int>, prio> pq3;
 
    pq3.push(3);
    pq3.push(2);
    pq3.push(1);
 
    cout << pq3.top() << endl;    // cout결과 : 1
    pq3.pop();
    cout << pq3.top() << endl;    // cout결과 : 2
    pq3.pop();
    cout << pq3.top() << endl;    // cout결과 : 3
    pq3.pop();
 
    return 0;
}

 

 


 

 

여기까지, C++의 priority_queue 사용법에 대하여 알아봤습니다.

감사합니다!

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 11286번 절댓값 힙(C++, Python)  (0) 2020.04.26
[Python] heapq 사용법  (0) 2020.04.26
[Baekjoon Online Judge] 백준 1927번 최소 힙(C++, Python)  (0) 2020.04.25
[Baekjoon Online Judge] 백준 11279번 최대 힙(C++, Python)  (0) 2020.04.25
[Apollo] Apollo란 무엇인가?  (0) 2020.04.24
    'Deprecated' 카테고리의 다른 글
    • [Baekjoon Online Judge] 백준 11286번 절댓값 힙(C++, Python)
    • [Python] heapq 사용법
    • [Baekjoon Online Judge] 백준 1927번 최소 힙(C++, Python)
    • [Baekjoon Online Judge] 백준 11279번 최대 힙(C++, Python)
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바