代码展示
#include<iostream>
#include<string>
#include<queue>
using namespace std;
class Person {
public:
Person(string name, int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
void test01() {
queue<Person>q;
Person p1("许应",48000);
Person p2("元未央",40000);
Person p3("缘七", 10000);
Person p4("钟爷", 20000);
q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4);
while (!q.empty()) {
cout << "队头———元素姓名为:" << q.front().m_Name
<< "年龄:" << q.front().m_Age << endl;
cout << "队尾———元素姓名为:" << q.back().m_Name
<< "年龄:" << q.back().m_Age << endl;
cout << "队大小" << q.size() << endl;
q.pop();
}
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
1. 容器的创建
在C++中,queue
是一个容器适配器,它基于其他容器(如deque
或list
)构建
默认情况下,queue
使用deque
作为底层容器,这是因为deque
支持快速的头尾操作,非常适合实现队列这种先进先出(FIFO, First In First Out)的数据结构
#include <queue>
using namespace std;
queue<Person> q;
上述代码中,我们包含了<queue>
头文件,并声明了一个名为q
的queue<Person>
类型的对象。这里Person
是我们自定义的一个类,用于存储人的姓名和年龄信息。由于queue
是模板类,因此可以用来存储任意类型的数据。
2. 数据结构形式
queue
是一种线性数据结构,它遵循FIFO原则,即最早插入的元素最先被移除。在queue
中,只能在一端(队尾)添加新元素,在另一端(队首)移除元素
这意味着:
- 入队(Enqueue):在队尾插入一个新元素。
- 出队(Dequeue):从队首移除一个元素。
为了实现这些功能,queue
内部依赖于某种底层容器来实际存储元素。正如前面提到,默认情况下queue
使用的是deque
,但也可以选择list
作为底层容器
需要注意的是,vector
不适用于queue
,因为它缺少必要的pop_front
操作
3. 常用操作
插入元素
使用push
方法可以在队尾插入一个新的Person
对象:
q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4);
每当我们调用push
时,新的Person
实例就会被添加到队列的末尾。
访问元素
虽然不能直接遍历整个队列,但我们可以通过front()
访问队首元素,通过back()
访问队尾元素:
cout << "队头———元素姓名为:" << q.front().m_Name
<< "年龄:" << q.front().m_Age << endl;
cout << "队尾———元素姓名为:" << q.back().m_Name
<< "年龄:" << q.back().m_Age << endl;
请注意,这里我们直接调用了成员变量m_Name
和m_Age
,这要求Person
类中的这些成员必须是公有的。如果希望保持封装性,则应提供适当的getter方法
删除元素
当需要移除队首元素时,可以使用pop()
方法:
q.pop();
值得注意的是,pop()
不会返回任何值;如果我们想获取并移除队首元素,应该先调用front()
读取该元素,然后再调用pop()
将其移除。
检查队列状态
还可以检查队列是否为空以及队列中的元素数量:
while (!q.empty()) {
// ...
cout << "队大小" << q.size() << endl;
}
这里的empty()
函数用于判断队列是否为空,而size()
则返回当前队列中元素的数量
综上所述,queue
容器提供了简单而高效的接口来处理那些需要按照特定顺序访问和操作元素的场景。通过理解其工作原理及如何正确地使用它所提供的成员函数,我们可以更好地利用这一强大的工具来简化编程任务。此外,了解queue
背后所依赖的具体实现(如deque
),也有助于优化程序性能,尤其是在处理大量数据的情况下