在 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