1.简介
queue(队列)在stl里面不是一个基础的容器(container),而是一个适配器(adapter),一般是封装了其他的基础容器作为存储基础。在stl里面,stl::queue是基于stl:deque双端队列来实现的,不过根据queue先进先出以及首尾快速存取的数据结构特点,也可以基于list进行实现,而不推荐vector之类的数组实现——因为在vector头部的插入或者删除速度过慢。根据STL之queue容器详解_std::queue-CSDN博客 这篇文章的介绍,可以看到stl里面常见的基本容器的一些特点。
2.基于list实现的queue
基于list实现的queue比较简单,所有的push、pop之类的操作都可以看做是对list的对应操作的进一步封装使用。
#include "MyList.h" //可以改为stl的list
template<typename T>
class Myqueue
{
public:
Myqueue() {};
Myqueue(const MyList<T>& _list)
: container(_list)
{};
~Myqueue() {};
bool empty()
{
return container.empty();
}
size_t size()
{
return container.size();
}
void push(const T& val = T())
{
container.push_back(val);
}
T& pop()
{
T front_val = container.front();
container.pop_front();
return front_val;
}
T& front()
{
return container.front();
}
T& back()
{
return container.back();
}
private:
MyList<T> container;
};
3.基于deque实现的queue
deque的介绍可以看这篇blog:C++中STL容器之双端队列——dequeue_c++ dequeue-CSDN博客简而言之是一种不连续的分块的、支持随机访问的、使用map存储各内存块首地址的线性存储结构,同时保证了块与块之间的顺序。
基于deque实现的queue在语法上与基于list实现的queue没有区别,只是容器类型从list变成了deque。
#include <deque>
template<typename T>
class MyQueue // 基于dequeue实现
{
public:
MyQueue() {};
~MyQueue() {};
bool empty()
{
return container.empty();
}
size_t size()
{
return container.size();
}
void push(const T& val = T())
{
container.push_back(val);
}
T& pop()
{
T front_val = container.front();
container.pop_front();
return front_val;
}
T& front()
{
return container.front();
}
T& back()
{
return container.back();
}
private:
std::deque<T> container;
};