往期汇总:
C++STL(1) vector容器汇总
C++STL(2) list容器汇总
C++STL(3) queue容器汇总
C++STL(4) stack容器汇总
C++STL(5) set容器汇总
C++STL(6) map容器汇总
C++STL(7) unordered_map容器汇总
C++STL(3) queue容器汇总
一、概述
当谈论C++中的队列(queue)容器时,队列是一种常见的容器,遵循先进先出(First-In-First-Out,FIFO)的原则。C++
的标准模板库(STL)提供了一个名为queue
的模板类,用于实现队列的功能。
以下是关于C++ STL队列的一些特点和函数:
-
包含头文件:要使用队列,需要包含头文件
<queue>
。 -
定义队列:可以使用
queue
模板类来定义队列对象。例如:queue<int> myQueue;
将创建一个名为myQueue
的整数类型队列。 -
元素入队:使用
push()
函数将元素推入队列的末尾。例如:myQueue.push(10);
将整数10推入队列myQueue
的末尾。 -
元素访问:由于队列遵循FIFO原则,只能访问队列的头部元素。使用
front()
函数可以访问队列的头部元素。例如:int frontElement = myQueue.front();
将队列myQueue
的头部元素赋值给变量frontElement
。 -
元素出队:使用
pop()
函数可以删除队列的头部元素。例如:myQueue.pop();
将删除队列myQueue
的头部元素。 -
队列大小:使用
size()
函数可以获取队列中元素的数量。例如:int queueSize = myQueue.size();
将队列myQueue
中的元素数量赋值给变量queueSize
。 -
判空检查:使用
empty()
函数可以检查队列是否为空。例如:bool isEmpty = myQueue.empty();
将队列myQueue
是否为空的结果赋值给变量isEmpty
。
STL队列提供了一种方便的方式来管理先进先出的数据。它在许多场景中非常有用,例如广度优先搜索(BFS)、任务调度等。
需要注意的是,STL队列不提供随机访问功能,只能访问队列的头部元素。如果需要随机访问元素,可以考虑使用其他数据结构,如向量(vector
)。
二、用法
当使用C++标准库中的std::queue
时,我们可以使用以下函数对队列进行操作:
-
push(const T& value)
:将元素添加到队列的末尾。参数value
是要添加的元素的值。例如:myQueue.push(10);
将整数10添加到队列myQueue
的末尾。 -
pop()
:删除队列头部的元素,即第一个添加的元素。 -
front()
:返回队列头部的元素值,即第一个添加的元素,而不删除它。 -
empty()
:检查队列是否为空。如果队列为空,则返回true
;否则返回false
。 -
size()
:返回队列中元素的数量。
下面是一个示例代码,演示了如何使用std::queue
的函数:
#include <iostream>
#include <queue>
int main() {
std::queue<int> myQueue;
// 元素入队
myQueue.push(10);
myQueue.push(20);
myQueue.push(30);
// 获取队列头部元素
int frontElement = myQueue.front();
std::cout << "Front element: " << frontElement << std::endl;
// 元素出队
myQueue.pop();
// 获取队列大小
int queueSize = myQueue.size();
std::cout << "Queue size: " << queueSize << std::endl;
// 判空检查
bool isEmpty = myQueue.empty();
std::cout << "Is queue empty? " << (isEmpty ? "Yes" : "No") << std::endl;
return 0;
}
在这个例子中,我们首先创建了一个整数类型的队列myQueue
。然后,我们使用push()
函数将元素10、20和30依次推入队列。接下来,我们使用front()
函数获取队列的头部元素,并将其存储在变量frontElement
中,最后输出该元素的值。然后,我们使用pop()
函数删除队列的头部元素(即第一个添加的元素)。我们还使用size()
函数获取队列的大小,并将其存储在变量queueSize
中,最后输出队列的大小。最后,我们使用empty()
函数检查队列是否为空,并将结果存储在变量isEmpty
中,最后输出结果。
当使用C++标准库中的std::queue
时,以下是一些额外的函数和特性:
-
back()
:返回队列尾部的元素值,即最后一个添加的元素,而不删除它。与front()
函数类似,但返回的是队列的末尾元素。 -
operator=
:可以使用赋值运算符将一个队列赋值给另一个队列。例如:queue2 = queue1;
将队列queue1
的内容复制到队列queue2
。 -
swap(queue& other)
:可以使用swap()
函数交换两个队列的内容。例如:queue1.swap(queue2);
将队列queue1
和队列queue2
的内容进行交换。 -
队列的迭代器:
std::queue
并不支持直接的迭代器访问,因为它是一种受限制的数据结构。如果需要遍历队列的元素,可以通过先将队列复制到其他容器(如std::vector
)再进行迭代。
下面是一个示例代码,演示了std::queue
的一些额外函数的使用:
#include <iostream>
#include <queue>
int main() {
std::queue<int> queue1, queue2;
// 元素入队
queue1.push(10);
queue1.push(20);
queue1.push(30);
// 获取队列头部元素
int frontElement = queue1.front();
std::cout << "Front element: " << frontElement << std::endl;
// 获取队列尾部元素
int backElement = queue1.back();
std::cout << "Back element: " << backElement << std::endl;
// 元素出队
queue1.pop();
// 获取队列大小
int queueSize = queue1.size();
std::cout << "Queue size: " << queueSize << std::endl;
// 判空检查
bool isEmpty = queue1.empty();
std::cout << "Is queue empty? " << (isEmpty ? "Yes" : "No") << std::endl;
// 交换队列内容
queue2.push(100);
queue2.push(200);
queue1.swap(queue2);
return 0;
}
在这个例子中,我们首先创建了两个整数类型的队列queue1
和queue2
。然后,我们使用push()
函数将元素10、20和30依次推入队列queue1
。接下来,我们使用front()
函数获取队列的头部元素,并将其存储在变量frontElement
中,最后输出该元素的值。我们还使用back()
函数获取队列的尾部元素,并将其存储在变量backElement
中,最后输出该元素的值。然后,我们使用pop()
函数删除队列的头部元素(即第一个添加的元素)。我们还使用size()
函数获取队列的大小,并将其存储在变量queueSize
中,最后输出队列的大小。最后,我们使用empty()
函数检查队列是否为空,并将结果存储在变量isEmpty
中,最后输出结果。最后,我们创建了队列queue2
,并使用push()
函数将元素100和200推入队列。然后,我们使用swap()
函数交换队列queue1
和队列queue2
的内容。
三、结语
队列(Queue)作为一种数据结构,在许多场景中具有以下优点:
-
先进先出(FIFO):队列按照先进先出的原则管理元素。首先加入队列的元素将首先被处理,这种特性使得队列非常适合模拟实际生活中的排队场景或按顺序处理任务的情况。
-
简单易用:队列的操作相对简单,通常只需要进行元素的入队和出队操作。这使得队列易于实现和理解,降低了使用队列的复杂性。
-
时间复杂度低:队列的入队和出队操作的时间复杂度通常是常数时间,即O(1)。这意味着无论队列中有多少元素,插入和删除操作的时间开销都相对较小,使得队列成为处理大量数据的高效选择。
-
广泛应用:队列在许多算法和问题中有广泛的应用。例如,广度优先搜索算法(BFS)中使用队列来管理待处理的节点,任务调度中使用队列来管理待执行的任务,消息队列用于实现异步通信等。因此,了解和熟悉队列的使用和特性是非常有益的。
-
支持多线程环境:队列通常被设计为线程安全的数据结构,可以在多线程环境下使用。多个线程可以同时对队列进行入队和出队操作,而不会导致数据混乱或冲突。
总之,队列作为一种简单而高效的数据结构,在许多场景中都是非常有用的。它具有先进先出的特性,支持高效的插入和删除操作,并广泛应用于各种算法和问题中。无论是在编写应用程序、解决算法问题还是在多线程环境中,队列都是一个有力的工具。