在 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