天天看點

深入淺出C++ ——queue類深度剖析一、queue的簡介二、queue類常用接口三、STL中queue類的模拟實作

文章目錄

  • 一、queue的簡介
  • 二、queue類常用接口
  • 三、STL中queue類的模拟實作

一、queue的簡介

  1. 隊列是一種容器擴充卡,專門用于在FIFO上下文(先進先出)中操作,其中從容器一端插入元素,另一端提取元素。
  2. 隊列作為容器擴充卡實作,容器擴充卡即将特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數來通路其元素。元素從隊尾入隊列,從隊頭出隊列。
  3. 底層容器可以是标準容器類模闆之一,也可以是其他專門設計的容器類。該底層容器應至少支援以下操作: empty:檢測隊列是否為空 、size:傳回隊列中有效元素的個數 、front:傳回隊頭元素的引用、 back:傳回隊尾元素的引用 、push_back:在隊列尾部入隊列、pop_front:在隊列頭部出隊列
  4. 标準容器類deque和list滿足了這些要求,而vector沒有pop_front這個接口,是以底層容器不能采用vector。預設情況下,如果沒有為queue執行個體化指定容器類,則使用标準容器deque。

  以上内容來自:www.cplusplus.com queue類文檔的介紹,在STL的學習中,推薦大家看這個文檔,對每個類都有詳細的介紹。

入隊和出隊

深入淺出C++ ——queue類深度剖析一、queue的簡介二、queue類常用接口三、STL中queue類的模拟實作

二、queue類常用接口

函數名稱 功能說明
queue() 構造空的隊列
empty() 檢測隊列是否為空,是傳回true,否則傳回false
size() 傳回隊列中有效元素的個數
front() 傳回隊頭元素的引用
back() 傳回隊尾元素的引用
push() 在隊尾将元素val入隊列
pop() 将隊頭元素出隊列

queue類常用接口應用

//std::queue<int> q;//構造函數
std::queue<int,std::list<int>> q;//構造函數
//MyQueue::queue<int,std::vector<int>> q; ---error 因為vector沒有pop_front這個接口
q.push(1);
q.push(2);
q.push(3);
q.push(4);

while (!q.empty())
{
	cout << q.front() << " ";
	q.pop();
}

std::queue<int>q2(q);				//拷貝構造函數
cout << q2.front() << endl;			//1
cout << q2.back() << endl;			//4

std::queue<int> q3;
q3=q;								//指派運算符重載
           

queue容器擴充卡

  queue 的底層容器預設是 deque 容器,是以模闆類型是

template <class T, class Container = deque<T> > class queue;

queue容器擴充卡的模闆有兩個參數,第一個參數是存儲對象的類型,第二個參數是底層容器的類型。另外,queue 的底層容器不可以使用

vector<T>

,因為vector沒有提供頭删

pop_front

的接口,不支援頭删。

三、STL中queue類的模拟實作

#include<deque>
#include<list>
namespace MyQueue
{
	 //template<class T, class Container = std::list<T>>
	template<class T, class Container = std::deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();
		}

		T& front()
		{
			return _con.front();
		}
		
	    T& back()
		{
			return _con.back();
		}
		
		const T& front() const
		{
			return _con.front();
		}

		const T& back()const
		{
			return _con.back();
		}

		size_t size() const 
		{
			return _con.size();
		}

		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}