在 C++ 中使用 STL 佇列容器

Jinku Hu 2023年1月30日 2021年6月28日
  1. 使用 std::queue 在 C++ 中宣告一個 STL 佇列物件
  2. 使用 size 成員函式在 C++ 中檢索佇列的大小
  3. 在 C++ 中使用 swap 成員函式交換兩個佇列物件的內容
在 C++ 中使用 STL 佇列容器

本文解釋瞭如何在 C++ 中使用 STL 佇列容器。

使用 std::queue 在 C++ 中宣告一個 STL 佇列物件

C++ 標準庫提供了幾個容器類,用於提供管理物件集合的基本型別。雖然,有一些特殊的容器稱為容器介面卡,它們使用最受限制的介面轉換基本容器以滿足特殊需求。

其中一個容器介面卡是 std::queue,它調整序列容器以提供 FIFO(先進先出)資料結構。請注意,底層基礎容器應實現 SequenceContainer 要求並具有四個成員函式:backfrontpush_backpop_front。只有來自基本容器的 std::dequestd::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,
Author: 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

相關文章 - C++ Queue