C++에서 STL 우선 순위 대기열 사용
-
std::priority_queue
를 사용하여 C++에서 우선 순위 큐 선언 - 템플릿 인수를 사용하여 C++에서 정렬 함수 지정
- 사용자 지정 비교기를 사용하여 C++에서 요소 순서 지정
이 기사에서는 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,
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