在 C++ 中使用 STL 佇列容器
本文解釋瞭如何在 C++ 中使用 STL 佇列容器。
使用 std::queue
在 C++ 中宣告一個 STL 佇列物件
C++ 標準庫提供了幾個容器類,用於提供管理物件集合的基本型別。雖然,有一些特殊的容器稱為容器介面卡
,它們使用最受限制的介面轉換基本容器以滿足特殊需求。
其中一個容器介面卡是 std::queue
,它調整序列容器以提供 FIFO(先進先出)資料結構。請注意,底層基礎容器應實現 SequenceContainer
要求並具有四個成員函式:back
、front
、push_back
和 pop_front
。只有來自基本容器的 std::deque
和 std::list
函式滿足上述要求,因此可用於儲存 queue
元素。
#include <iostream>
#include <queue>
using std::cout; using std::endl;
using std::queue; using std::string;
template<typename Queue>
void printQueue(Queue q) {
while (!q.empty()) {
cout << q.front() << ", ";
q.pop();
}
cout << endl;
}
int main()
{
std::queue<string> q1;
std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};
for(const auto& n : deq1)
q1.push(n);
printQueue(q1);
std::queue<string> q2(deq1);
printQueue(q2);
return EXIT_SUCCESS;
}
輸出:
one, eight, six, seven, eleven, ten,
one, eight, six, seven, eleven, ten,
std::queue
容器可以使用現有的 std::deque
物件進行初始化。後者初始化的建構函式只需要一個 deque
型別的引數。另一方面,我們可以宣告一個佇列物件並使用 push
函式新增元素。在上面的程式碼片段中,我們演示了上述方法並使用 printQueue
函式列印佇列的內容。
請注意,佇列元素的迭代是通過使用 empty
函式的 while
迴圈完成的,因為迭代器不可訪問。在每個迴圈迴圈中,我們使用 front
成員函式訪問第一個元素,並使用 pop
刪除相同的元素。由於後一個操作修改了原始佇列物件,我們接受它作為值引數而不是引用。
使用 size
成員函式在 C++ 中檢索佇列的大小
你可以使用 size
成員函式來檢索佇列物件中的元素數。該函式具有恆定的時間效能。
#include <iostream>
#include <queue>
using std::cout; using std::endl;
using std::queue; using std::string;
int main()
{
std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};
std::queue<string> q2(deq1);
cout << "size of the queue = " << q2.size() << endl;
return EXIT_SUCCESS;
}
輸出:
size of the queue = 6
在 C++ 中使用 swap
成員函式交換兩個佇列物件的內容
我們可以使用 swap
成員函式交換兩個佇列物件的元素。它將另一個佇列物件作為唯一引數,並與呼叫者物件交換其內容。請注意,引數物件分配了呼叫者佇列的內容。
#include <iostream>
#include <queue>
using std::cout; using std::endl;
using std::queue; using std::string;
template<typename Queue>
void printQueue(Queue q) {
while (!q.empty()) {
cout << q.front() << ", ";
q.pop();
}
cout << endl;
}
int main()
{
std::queue<string> q1;
std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};
for(const auto& n : deq1)
q1.push(n);
std::queue<string> q2(deq1);
q2.push(deq1.front());
q2.push("zero");
cout << "q1: " ;
printQueue(q1);
cout << "q2: " ;
printQueue(q2);
q1.swap(q2);
cout << "q1: " ;
printQueue(q1);
cout << "q2: " ;
printQueue(q2);
return EXIT_SUCCESS;
}
輸出:
q1: one, eight, six, seven, eleven, ten,
q2: one, eight, six, seven, eleven, ten, one, zero,
q1: one, eight, six, seven, eleven, ten, one, zero,
q2: one, eight, six, seven, eleven, ten,
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