C++에서 STL 우선 순위 대기열 사용

Jinku Hu 2023년10월12일
  1. std::priority_queue를 사용하여 C++에서 우선 순위 큐 선언
  2. 템플릿 인수를 사용하여 C++에서 정렬 함수 지정
  3. 사용자 지정 비교기를 사용하여 C++에서 요소 순서 지정
C++에서 STL 우선 순위 대기열 사용

이 기사에서는 C++에서 STL 우선 순위 큐를 사용하는 방법에 대한 여러 방법을 보여줍니다.

std::priority_queue를 사용하여 C++에서 우선 순위 큐 선언

std::priority_queue클래스는 우선 순위에 따라 요소를 읽는 큐를 구현하는 컨테이너 어댑터입니다. priority_queue는 요소에 대해 내부적으로 모든 시퀀스 컨테이너를 사용할 수 있으며 사용자는 선호하는 것을 두 번째 템플릿 매개 변수로 전달할 수 있습니다. 후자의 매개 변수를 지정하지 않으면vector컨테이너가 기본적으로 사용됩니다.

priority_queue의 요소는queue컨테이너와 동일한 기능을 사용하여 조작됩니다. push멤버 함수는 새 요소를 큐에 삽입하고top함수는 최상위 요소에 액세스합니다. 이 두 함수는printQueue함수에서 사용되어 요소를cout스트림으로 출력합니다.

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::priority_queue;
using std::string;
using std::vector;

template <typename Queue>
void printQueue(Queue& q) {
  while (!q.empty()) {
    cout << q.top() << ", ";
    q.pop();
  }
  cout << endl;
}

int main() {
  std::priority_queue<int> q1;
  vector vec1 = {1, 8, 5, 6, 3, 7};

  for (int n : vec1) q1.push(n);

  printQueue(q1);

  return EXIT_SUCCESS;
}

출력:

8, 7, 6, 5, 3, 1,

템플릿 인수를 사용하여 C++에서 정렬 함수 지정

각 요소의 우선 순위는 사용자가 선택적으로 지정할 수있는 비교 기능을 사용하여 결정됩니다. 그렇지 않으면 기본적으로 내림차순이 선택됩니다. std::greater함수 객체를 세 번째 템플릿 매개 변수로 사용하여 이전 예제 코드의priority_queue를 역순으로 구성 할 수 있습니다. 새 큐 컨테이너는 범위 기반 생성자를 사용하여 초기화됩니다.

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::priority_queue;
using std::string;
using std::vector;

template <typename Queue>
void printQueue(Queue& q) {
  while (!q.empty()) {
    cout << q.top() << ", ";
    q.pop();
  }
  cout << endl;
}

int main() {
  std::priority_queue<int> q1;
  vector vec1 = {1, 8, 5, 6, 3, 7};

  std::priority_queue<int, vector<int>, std::greater<>> q2(vec1.begin(),
                                                           vec1.end());
  printQueue(q2);

  return EXIT_SUCCESS;
}

출력:

1, 3, 5, 6, 7, 8,

사용자 지정 비교기를 사용하여 C++에서 요소 순서 지정

처음에는priority_queue를 초기화하는 데 사용되는 문자열의vector를 정의합니다. 다음으로 람다식이 정의되어 비교 함수를 형성합니다. 후자는 길이로 두 문자열을 비교합니다. 이제 요소 유형, 기본 컨테이너 유형 및 비교 함수를 각각 지정하는 세 가지 템플릿 매개 변수로priority_queue객체를 선언 할 수 있습니다. 범위 기반 생성자는 큐의 내용을 초기화하는 데 사용됩니다.

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::priority_queue;
using std::string;
using std::vector;

template <typename Queue>
void printQueue(Queue& q) {
  while (!q.empty()) {
    cout << q.top() << ", ";
    q.pop();
  }
  cout << endl;
}

int main() {
  vector vec2 = {"porro", "quisquam", "est", "qui", "dolorem", "ipsum", "quia"};
  auto compFunc = [](const string& s1, const string& s2) {
    return s1.length() < s2.length();
  };

  std::priority_queue<string, vector<string>, decltype(compFunc)> q3(
      vec2.begin(), vec2.end(), compFunc);

  printQueue(q3);

  return EXIT_SUCCESS;
}

출력:

quisquam, dolorem, ipsum, porro, quia, qui, est,
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Queue