本文主要是介绍C++ STL-Queue容器概念及应用方法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 再谈队列
队列和栈不同,队列是一种先进先出的数据结构,STL的队列内容极其重要,虽然内容较少但是请务必掌握,STL的队列是快速构建搜索算法以及相关的数论图论的状态存储的基础。
概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。
- 队列容器允许从一端新增元素,从另一端移除元素。
- 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为。
- 队列中进数据称为 — 入队 push
- 队列中出数据称为 — 出队 pop
2.相关头文件
头文件:#include<queue>
3.初始化
格式为:
**explicit** queue (**const** container_type& ctnr = container_type());
我们以int类型作为参数为例进行创建。
queue<**int**> q; //创建一个空的没有数据的队列q
queue<**int**> qoo(q); //创建一个队列其元素为q的全部内容
标准的队列创建方法是直接创建空队列再进行其他的操作,由于队列的特殊性质,拥有其他容器的参数可以这样创建,这种多参数的方式可能有一些复杂,一般也很少这样使用。
vector<**int**> v(3,100);
queue<**int**,vector<**int**> > s(v); //注意,> >符号之间需要有一个空格隔开
通过标准的方式创建向量数组,然后通过复制构造函数的方式进行创建,其内容就是vector数组的全部内容。
4. 迭代器
栈和队列都属于一种特殊的数据结构,只能通过访问顶层数据并不断剔除数据的方法进行全部访问,因此没有直接的迭代器。
5. 常用接口
我们预先通过queue<int> q创建了一个队列,命名为q,方便举例。
a. 大小size()
返回队列元素的个数
函数原型:size_type size() const;
cout<<q.size()<<endl; //直接返回队列元素的个数
b. 入队push()
进行入队操作,在队尾处进行插入
函数原型:void push (const value_type& val);
q.push(100);
c. 出队pop()
进行出队操作,在对头出进行弹出
函数原型:void pop();
q.pop();
d. 访问队头元素front()
访问对头元素,可以返回其数值,也可以进行相应的操作,这里更加建议多使用front()访问队头数据,因为我们进行出队操作均是从队头进行出队的。
函数原型:
value_type& front();
const value_type& front() const;
q.front()+=500; //对队头元素进行修改
cout<<q.front()<<endl; //直接输出内容
**e. 访问队尾元素back()**
访问队尾元素,较为少用。
函数原型:
value_type& back();
const value_type& back() const;
**while**(q.empty()){
cout<<q.front()<<endl;
q.pop();
}
f. 判空empty()
返回一个bool类型的值,只存在真和假,当队列为空时为真,不为空时为假
函数原型
bool empty() const;
可以利用empty()进行队列的遍历操作,这里建议先使用初始化函数将队列进行复制,否则遍历之后队列就为空了。
6. queue 常用操作
a. 构造函数:
函数原型 | 功能 |
---|---|
queue que; | queue采用模板类实现,queue对象的默认构造形式。 |
queue(const queue &que); | 拷贝构造函数。 |
b. 赋值操作:
函数原型 | 功能 |
---|---|
queue& operator=(const queue &que); | 重载等号操作符。 |
c. 数据存取:
函数原型 | 功能 |
---|---|
push(elem); | 往队尾添加元素。 |
pop(); | 从队头移除第一个元素。 |
back(); | 返回最后一个元素。 |
front(); | 返回第一个元素。 |
d. 大小操作
函数原型 | 功能 |
---|---|
empty(); | 判断堆栈是否为空 |
size(); | 返回栈的大小 |
e.代码示例:
#include <queue>
#include <string>
#include <iostream>
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("唐僧", 30);Person p2("孙悟空", 1000);Person p3("猪八戒", 900);Person p4("沙僧", 800);//向队列中添加元素 入队操作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 << endl;//弹出队头元素q.pop();}cout << "队列大小为:" << q.size() << endl;
}int main() {test01();system("pause");return 0;
}
这篇关于C++ STL-Queue容器概念及应用方法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!