본문 바로가기
개발/C++

[C++] priority_queue (우선순위 큐)

by WaDDak 2024. 8. 15.

std::priority_queue는 C++ 표준 라이브러리에서 제공하는 컨테이너 어댑터로, 우선순위 큐를 구현합니다. 우선순위 큐는 일반적인 큐와 달리, 요소들이 우선순위에 따라 정렬되어 큐의 앞부분에 위치하며, 가장 높은 우선순위를 가진 요소가 먼저 꺼내집니다.

 

주요 특징:

  • 우선순위: std::priority_queue는 기본적으로 **최대 힙(Max-Heap)**으로 구현되어 있어, 가장 큰 요소가 항상 맨 앞에 위치합니다. 이는 자동으로 내림차순으로 정렬된다는 의미입니다.
  • 기본 동작: std::priority_queue는 std::vector 또는 std::deque와 같은 기본 컨테이너를 내부적으로 사용하여 데이터를 저장하며, 힙을 사용하여 요소를 정렬합니다.

 

 

사용법:

1. 기본 사용법 (최대 힙)

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

int main() {
    std::priority_queue<int> pq;

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

    std::cout << "Top element: " << pq.top() << std::endl;  // 20

    pq.pop();  // 20 제거

    std::cout << "Top element after pop: " << pq.top() << std::endl;  // 10

    return 0;
}
  • push: 요소를 우선순위 큐에 추가합니다. (추가하고 자동으로 정렬 됨.)
  • top: 큐의 가장 앞에 있는 요소(우선순위가 가장 높은 요소)를 반환합니다.
  • pop: 큐의 가장 앞에 있는 요소를 제거합니다.
  • empty: 큐가 비어 있는지 확인합니다.
  • size: 큐의 요소 개수를 반환합니다.

 

2. 최소 힙으로 사용하기 (std::greater 사용)

기본적으로 std::priority_queue는 최대 힙을 구현합니다. 최소 힙을 구현하려면 std::greater를 사용하여 비교 기준을 변경해야 합니다. 

std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

 

std::priority_queue의 템플릿 인자 중 두 번째 인자인 Container는 기본값으로 std::vector<T>가 사용됩니다. 따라서, 별도로 명시하지 않으면 priority_queue는 내부적으로 std::vector를 사용하여 요소들을 저장하고 관리합니다.

세 번째 인자인 Compare는 기본값으로 std::less<T>가 사용됩니다. 이 std::less가 우선순위 큐를 최대 힙으로 동작하게 만듭니다.

기본 인자 설정

  • Container: std::vector<T> (생략 가능)
  • Compare: std::less<T> (생략 가능)

최소 힙을 만들기 위해 필요한 것

  • std::greater<T>를 사용: 최소 힙을 만들려면 세 번째 인자에 std::greater<T>를 명시적으로 지정해야 합니다.

 

3. 사용자 정의 구조체를 사용한 우선순위 큐

복잡한 데이터를 우선순위 큐에 저장할 때는 사용자 정의 비교 함수를 사용해야 합니다.

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

struct Task {
    int priority;
    std::string name;

    bool operator<(const Task& other) const {
        return priority < other.priority;  // 큰 값이 우선
    }
};

int main() {
    std::priority_queue<Task> tasks;

    tasks.push({3, "Task 1"});
    tasks.push({1, "Task 2"});
    tasks.push({2, "Task 3"});

    while (!tasks.empty()) {
        std::cout << tasks.top().name << " with priority " << tasks.top().priority << std::endl;
        tasks.pop();
    }

    return 0;
}

 

 

핵심 개념 요약:

  • 힙 기반: std::priority_queue는 힙을 사용하여 우선순위를 유지합니다. 기본적으로 최대 힙이지만, 비교 함수를 제공하여 최소 힙 또는 사용자 정의 우선순위를 구현할 수 있습니다.
  • 시간 복잡도: push, pop 연산의 시간 복잡도는 O(log n)이며, top 연산은 O(1)입니다. 이는 힙의 높이에 비례하여 효율적으로 동작합니다.
  • 응용: 우선순위 큐는 다양한 알고리즘에서 사용되며, 특히 다익스트라의 최단 경로 알고리즘, 프림의 최소 신장 트리 알고리즘, 힙 정렬 등에 사용됩니다.

 

 

결론:

std::priority_queue는 특정 기준에 따라 요소들이 자동으로 정렬되고, 가장 높은 우선순위 요소가 먼저 처리되는 자료 구조입니다. 기본적으로 최대 힙을 제공하며, 필요에 따라 최소 힙이나 사용자 정의 우선순위를 사용할 수 있습니다. 이를 통해 다양한 알고리즘 및 데이터 처리 문제를 효율적으로 해결할 수 있습니다.

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

<algorithm> 메서드  (0) 2024.08.28
삼총사  (0) 2024.08.25
[C++] 덱 std::deque  (0) 2024.08.25
[C++] 큐 std::queue  (0) 2024.08.25
[C++] sort  (0) 2024.08.15