国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【c++】:“無敵的適配器來咯“棧和隊列模擬實現(xiàn)以及優(yōu)先級隊列的模擬實現(xiàn)。

這篇具有很好參考價值的文章主要介紹了【c++】:“無敵的適配器來咯“棧和隊列模擬實現(xiàn)以及優(yōu)先級隊列的模擬實現(xiàn)。。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-789928.html

?

文章目錄

  • 前言
  • 一.棧和隊列的模擬實現(xiàn)
  • 二.優(yōu)先級隊列
  • 總結(jié)

?


前言

棧的介紹和使用:

1. stack是一種容器適配器,專門用在具有后進先出操作的上下文環(huán)境中,其刪除只能從容器的一端進行元素的插入與提取操作。
2. stack是作為容器適配器被實現(xiàn)的,容器適配器即是對特定類封裝作為其底層的容器,并提供一組特定的成員函數(shù)來訪問其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出。
3. stack的底層容器可以是任何標(biāo)準(zhǔn)的容器類模板或者一些其他特定的容器類,這些容器類應(yīng)該支持以下操作:
empty:判空操作
back:獲取尾部元素操作
push_back:尾部插入元素操作
pop_back:尾部刪除元素操作
4. 標(biāo)準(zhǔn)容器vector、deque、list均符合這些需求,默認情況下,如果沒有為stack指定特定的底層容器,默認情況下使用deque。
?
隊列的介紹和使用:
1. 隊列是一種容器適配器,專門用于在FIFO上下文(先進先出)中操作,其中從容器一端插入元素,另一端提取元素。
2. 隊列作為容器適配器實現(xiàn),容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數(shù)來訪問其元素。元素從隊尾入隊列,從隊頭出隊列。
3. 底層容器可以是標(biāo)準(zhǔn)容器類模板之一,也可以是其他專門設(shè)計的容器類。該底層容器應(yīng)至少支持以下操作:
empty:檢測隊列是否為空
size:返回隊列中有效元素的個數(shù)
front:返回隊頭元素的引用
back:返回隊尾元素的引用
push_back:在隊列尾部入隊列
pop_front:在隊列頭部出隊列
4. 標(biāo)準(zhǔn)容器類deque和list滿足了這些要求。默認情況下,如果沒有為queue實例化指定容器類,則使用標(biāo)準(zhǔn)容器deque。

?

一、棧和隊列的模擬實現(xiàn)

容器適配器:

適配器是一種設(shè)計模式(設(shè)計模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)), 該種模式是將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。

前面我們說過stack和queue是一種容器適配器,同樣也是作為容器適配器被實現(xiàn)的,所以我們可以直接使用一個公共的容器來當(dāng)stack的適配器,適配器是用來轉(zhuǎn)換的,將已有的東西進行轉(zhuǎn)換,比如將vector當(dāng)我們棧的容器實現(xiàn)棧的功能,我們先看一下庫中如何描述棧的:

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

?可以看到庫中是用的deque來當(dāng)stack的容器,并且stack的接口非常簡單,所以我們現(xiàn)在就開始實現(xiàn):

#include <vector>
#include <iostream>
using namespace std;

namespace sxy
{
	template<class T,class Container = vector<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		T& top()
		{
			return _con.back();
		}
		const T& top() const
		{
			return _con.back();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
	void test3()
	{
		stack<int> st;
		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);
		while (!st.empty())
		{
			cout << st.top() << " ";
			st.pop();
		}
	}
}

?因為我們要使用vector做適配器所以包含了vector的頭文件,然后我們所有的函數(shù)直接使用容器的公共接口即可,比如vector的push_back等等。在模板中我們用了vector的缺省容器,如果你不想用vector,你也可以使用list作為stack的容器,只需要:stack<int,list<int>>?我們的第一步是創(chuàng)建一個容器的對象_con.

        void push(const T& x)
		{
			_con.push_back(x);
		}

?對于push我們直接使用容器的尾插即可。

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

?對于pop直接使用尾刪即可,因為棧本來就是后進先出的。

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

?top是返回棧頂元素,容器中的back()接口返回的就是棧頂元素。

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

?size()和empty與上述同理,都使用容器的公共接口就能解決。

隊列的模擬實現(xiàn)

我們先看一下庫中的實現(xiàn),同樣也是用deque作為queue的容器。

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

?在這里我們要說明一下,由于vector的頭刪效率極低,所以vector是不能作為queue的容器的。這里可以用list作為queue的容器,也可以用deque作為queue的容器。第一步是創(chuàng)建一個容器的對象_con.

#include <deque>
#include <iostream>
using namespace std;

namespace sxy
{
	template<class T,class Container = deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_front();
		}
		T& front()
		{
			return _con.front();
		}
		const T& front() const
		{
			return _con.front();
		}
		T& back()
		{
			return _con.back();
		}
		const T& back() const
		{
			return _con.back();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}

	private:
		Container _con;
	};
	void test2()
	{
		queue<int> qe;
		qe.push(1);
		qe.push(2);
		qe.push(3);
		qe.push(4);
		while (!qe.empty())
		{
			cout << qe.front() << " ";
			qe.pop();
		}
	}
}

?隊列的實現(xiàn)與棧不同的是隊尾插入隊頭出,所以對于pop接口和top接口而言是不一樣的:

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

?隊列要頭刪所以用頭刪的接口。

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

?這里提供了隊頭元素的返回和隊尾元素的返回,因為庫中也是實現(xiàn)的。

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

?這樣棧和隊列的模擬實現(xiàn)就完成了,對于棧和隊列我們只需要明白適配器的使用,只要學(xué)到了這個后面很多的實現(xiàn)都變簡單了。

二、優(yōu)先級隊列

什么是優(yōu)先級隊列呢?

1. 優(yōu)先隊列是一種容器適配器,根據(jù)嚴格的弱排序標(biāo)準(zhǔn),它的第一個元素總是它所包含的元素中最大的。
2. 此上下文類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優(yōu)先隊列中位于頂部的元素)。
3. 優(yōu)先隊列被實現(xiàn)為容器適配器,容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數(shù)來訪問其元素。元素從特定容器的“尾部”彈出,其稱為優(yōu)先隊列的頂部。
4. 底層容器可以是任何標(biāo)準(zhǔn)容器類模板,也可以是其他特定設(shè)計的容器類。容器應(yīng)該可以通過隨機訪問迭代器訪問,并支持以下操作:
empty():檢測容器是否為空
size():返回容器中有效元素個數(shù)
front():返回容器中第一個元素的引用
push_back():在容器尾部插入元素
pop_back():刪除容器尾部元素
5. 標(biāo)準(zhǔn)容器類vector和deque滿足這些需求。默認情況下,如果沒有為特定的priority_queue類實例化指定容器類,則使用vector。
6. 需要支持隨機訪問迭代器,以便始終在內(nèi)部保持堆結(jié)構(gòu)。容器適配器通過在需要時自動調(diào)用算法函數(shù)make_heap、push_heap和pop_heap來自動完成此操作。
?

下面我們來看看庫中的優(yōu)先級隊列:

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++?我們可以看到優(yōu)先級隊列的實現(xiàn)除了容器外還多了一個Compare,這個是什么呢?這個其實是一個仿函數(shù),這里的仿函數(shù)是來解決優(yōu)先級隊列是小的優(yōu)先級高還是大的優(yōu)先級高,我們默認是大的優(yōu)先級高也就是大堆。

#include <deque>
using namespace std;
#include <iostream>

namespace sxy
{
	template<class T>
	struct less
	{
		bool operator()(const T& x, const T& y)
		{
			return x < y;
		}
	};
	template<class T>
	struct greater
	{
		bool operator()(const T& x, const T& y)
		{
			return x > y;
		}
	};
	template<class T,class Container = deque<T>,class Compare = less<T>>
	class priority_queue
	{
	public:
		void adjust_up(int child)
		{
			Compare com;
			size_t parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[parent] < _con[child])
				if (com(_con[parent],_con[child]))
				{
					swap(_con[parent], _con[child]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}
		void adjust_down(int parent)
		{
			Compare com;
			size_t child = 2 * parent + 1;
			while (child < _con.size())
			{
				//if ((child + 1) < _con.size() && _con[child] < _con[child + 1])
				if ((child+1)<_con.size()&&com(_con[child],_con[child+1]))
				{
					++child;
				}
				//if (_con[parent] < _con[child])
				if (com(_con[parent],_con[child]))
				{
					swap(_con[parent], _con[child]);
					parent = child;
					child = 2 * parent + 1;
				}
				else
				{
					break;
				}
			}
		}
		void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}
		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}
		T& top()
		{
			return _con.front();
		}
		const T& top() const 
		{
			return _con.front();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
	void test1()
	{
		priority_queue<int> pq;
		pq.push(1);
		pq.push(16);
		pq.push(14);
		pq.push(19);
		pq.push(17);
		pq.push(12);
		while (!pq.empty())
		{
			cout << pq.top() << " ";
			pq.pop();
		}
	}
}

第一步是創(chuàng)建一個容器的對象_con.?

?我們一個函數(shù)一個函數(shù)依次來分析:

        void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}

?首先是push,由于優(yōu)先級隊列本質(zhì)還是一個隊列,所以遵循先進先出的原則。插入的時候在隊尾插入即可,這個時候我們不能結(jié)束,因為要排優(yōu)先級,所以我們要將最后插入的這個數(shù)依次向前調(diào)整。聽到這里是不是很熟悉呢?沒錯!這其實就是我們之前講過的堆,而這個adjust_up函數(shù)也和我們當(dāng)時實現(xiàn)的向上調(diào)整一模一樣,所以在這里我們就不在詳細的介紹如何調(diào)整了,具體的可以去看我的那篇關(guān)于堆的文章。

        void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}

?對于一個已經(jīng)排好序的隊列我們是不可以直接出數(shù)據(jù)的,為了保證數(shù)據(jù)的有序性我們先講第一個元素和最后一個元素交換,這樣我們就把要刪除的第一個隊頂元素移到了隊尾,然后直接尾刪就刪掉了原先的隊頭元素,剛剛我們將最后一個元素換到了對頭,所以我們要讓對頭這個數(shù)據(jù)依次向下調(diào)整來保持有序性。

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

?由于優(yōu)先級隊列只提供對頭元素的返回所以我們只用容器的front接口即可。

想要看明白向上調(diào)整接口需要先介紹一下仿函數(shù):

    template<class T>
	struct less
	{
		bool operator()(const T& x, const T& y)
		{
			return x < y;
		}
	};
	template<class T>
	struct greater
	{
		bool operator()(const T& x, const T& y)
		{
			return x > y;
		}
	};

?我們可以看到仿函數(shù)的實現(xiàn)其實就是創(chuàng)建一個類然后里面封裝一個()的運算符重載,比如我們的less小于,對于一個數(shù)是否小于另一個數(shù)我們可以直接寫為:Compare com com(x,y),這時候肯定會有人說有什么用呢,用其他方式也能替代。如果這樣想那就錯了,仿函數(shù)作為STL的六大接口之一又怎么會沒用呢?下面我們就能見識到仿函數(shù)的重要性:

        void adjust_up(int child)
		{
			Compare com;
			size_t parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[parent] < _con[child])
				if (com(_con[parent],_con[child]))
				{
					swap(_con[parent], _con[child]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

?對于向上調(diào)整函數(shù)的實現(xiàn)我們先創(chuàng)建一個仿函數(shù)對象,然后計算孩子節(jié)點的父節(jié)點,當(dāng)孩子節(jié)點大于0時進入循環(huán),在這里我們是不用判斷child>=0的,因為等于0這個孩子就變成所有節(jié)點的祖先了還哪有父節(jié)點呢?然后我們直接用仿函數(shù)判斷如果父親小于孩子(因為默認是大堆)節(jié)點就進行向上調(diào)整,向上調(diào)整就是將父節(jié)點和孩子節(jié)點交換,然后讓孩子節(jié)點到以前父節(jié)點的位置上,在重新算父節(jié)點這樣就能依次向上連續(xù)調(diào)整,一旦發(fā)現(xiàn)父節(jié)點大于孩子節(jié)點滿足大堆的條件我們就break即可。在這里如果沒有這個仿函數(shù),我們該如何隨意控制優(yōu)先級隊列是大堆還是小堆呢?所以仿函數(shù)真的很重要。

        void adjust_down(int parent)
		{
			Compare com;
			size_t child = 2 * parent + 1;
			while (child < _con.size())
			{
				//if ((child + 1) < _con.size() && _con[child] < _con[child + 1])
				if ((child+1)<_con.size()&&com(_con[child],_con[child+1]))
				{
					++child;
				}
				//if (_con[parent] < _con[child])
				if (com(_con[parent],_con[child]))
				{
					swap(_con[parent], _con[child]);
					parent = child;
					child = 2 * parent + 1;
				}
				else
				{
					break;
				}
			}
		}

?向下調(diào)整函數(shù)是將父節(jié)點依次和左右孩子節(jié)點相比較,默認是大堆,如果父節(jié)點小于孩子節(jié)點就交換,由于向下調(diào)整的時候我們需要看孩子節(jié)點哪個更大,父節(jié)點與大的那個孩子節(jié)點交換,所以我們先默認孩子節(jié)點是左孩子,由于孩子節(jié)點是依次向下調(diào)整的,所以循環(huán)條件為孩子小于size()就進入循環(huán),進入循環(huán)后我們首先判斷右孩子是否存在,因為一個完全二叉樹是有可能沒有右孩子的。如果右孩子存在并且左孩子小于右孩子我們就讓孩子節(jié)點++變成右孩子。當(dāng)父節(jié)點小于孩子節(jié)點的時候我們就進行調(diào)整,先交換父節(jié)點和孩子節(jié)點,然后讓父節(jié)點到剛剛孩子節(jié)點的位置上去,再重新計算孩子節(jié)點。當(dāng)父節(jié)點不小于孩子節(jié)點時就不需要調(diào)整直接break即可。

下面我們驗證一下我們寫的優(yōu)先級隊列:

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

?因為默認是大堆所以我們看到確實排序完成了,下面我們換個適配器驗證一下小堆。

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

?下面我們簡單的介紹一下什么是deque:

deque 的原理介紹:
deque( 雙端隊列 ) :是一種雙開口的 " 連續(xù) " 空間的數(shù)據(jù)結(jié)構(gòu),雙開口的含義是:可以在頭尾兩端進行插入和刪除操作,且時間復(fù)雜度為O(1),與vector比較,頭插效率高,不需要搬移元素;與list比較,空間利用率比較高。
empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

?deque并不是真正連續(xù)的空間,而是由一段段連續(xù)的小空間拼接而成的,實際deque類似于一個動態(tài)的二維數(shù)組,其底層結(jié)構(gòu)如下圖所示:

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

雙端隊列底層是一段假象的連續(xù)空間,實際是分段連續(xù)的,為了維護其 整體連續(xù) 以及隨機訪問的假象,落 在了 deque 的迭代器身上,因此deque的迭代器設(shè)計就比較復(fù)雜,如下圖所示:
empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

那deque是如何借助其迭代器維護其假想連續(xù)的結(jié)構(gòu)呢?看下圖:

empty模擬,c++,后端,模板方法模式,visualstudio,數(shù)據(jù)結(jié)構(gòu),c++

我們可以看到deque的實現(xiàn)非常的復(fù)雜,雖然插入刪除比vector方便了不少并且對于空間的擴容也優(yōu)于vector,但卻沒有極致的優(yōu)點,所以只能淪為容器適配器。

deque 的缺陷
vector 比較,deque的優(yōu)勢是:頭部插入和刪除時, 不需要搬移元素,效率特別高,而且在 擴容時,也不 需要搬移大量的元素,因此其效率是必vector高的。
list 比較,其底層是連續(xù)空間, 空間利用率比較高,不需要存儲額外字段。
但是, deque 有一個致命缺陷:不適合遍歷,因為在遍歷時, deque 的迭代器要頻繁的去檢測其是否移動到 某段小空間的邊界,導(dǎo)致效率低下,而序列式場景中,可能需要經(jīng)常遍歷,因此 在實際中,需要線性結(jié)構(gòu) 時,大多數(shù)情況下優(yōu)先考慮 vector list,deque的應(yīng)用并不多,而 目前能看到的一個應(yīng)用就是, STL 用其作 stack queue 的底層數(shù)據(jù)結(jié)構(gòu)。
為什么選擇 deque 作為 stack queue 的底層默認容器?
stack是一種后進先出的特殊線性數(shù)據(jù)結(jié)構(gòu),因此只要具有push_back()和pop_back()操作的線性結(jié)構(gòu),都可以作為stack的底層容器,比如vector和list都可以;queue是先進先出的特殊線性數(shù)據(jù)結(jié)構(gòu),只要具有push_back和pop_front操作的線性結(jié)構(gòu),都可以作為queue的底層容器,比如list。但是STL中對stack和queue默認選擇deque作為其底層容器,主要是因為:
1. stack和queue不需要遍歷(因此stack和queue沒有迭代器),只需要在固定的一端或者兩端進行操作。
2. 在stack中元素增長時,deque比vector的效率高(擴容時不需要搬移大量數(shù)據(jù));queue中的元素增長時,deque不僅效率高,而且內(nèi)存使用率高。
結(jié)合了deque的優(yōu)點,而完美的避開了其缺陷。

?

總結(jié)

本節(jié)相對比較簡單,因為很多都是我們之前學(xué)過的知識,本篇文章的重點在于了解并且會熟悉的使用適配器,我們會發(fā)現(xiàn)有了適配器是非常方便的,之前我們用C語言寫棧和隊列的時候隨便就一兩百行代碼,而用c++實現(xiàn)棧和隊列不到60行就能搞定。deque的出現(xiàn)本來是為了替代vector和list的,結(jié)果卻成為了stack和queue的容器適配器,這是因為deque沒有一個極致的優(yōu)點,不像vector那樣可以隨意訪問元素,也不能像list那樣任意位置插入刪除的效率高。下一篇要講的內(nèi)容是反向迭代器的實現(xiàn)與適配(干貨滿滿哦~)。

?

到了這里,關(guān)于【c++】:“無敵的適配器來咯“棧和隊列模擬實現(xiàn)以及優(yōu)先級隊列的模擬實現(xiàn)。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【簡化程序設(shè)計】C++STL“容器適配器“之棧和隊列

    【簡化程序設(shè)計】C++STL“容器適配器“之棧和隊列

    ??博客主頁:小智_x0___0x_ ??歡迎關(guān)注:??點贊??收藏??留言 ??系列專欄:C++初階 ??代碼倉庫:小智的代碼倉庫 【本節(jié)目標(biāo)】: stack的介紹和使用 stack的模擬實現(xiàn) queue的介紹和使用 queue的模擬實現(xiàn) priority_queue的介紹和使用 priority_queue的模擬實現(xiàn) 容器適配器 deuqe的介紹

    2024年02月15日
    瀏覽(23)
  • [C++] STL_priority_queue(優(yōu)先級隊列) 的使用及底層的模擬實現(xiàn),容器適配器,deque的原理介紹

    [C++] STL_priority_queue(優(yōu)先級隊列) 的使用及底層的模擬實現(xiàn),容器適配器,deque的原理介紹

    priority_queue文檔介紹 翻譯: 1. 優(yōu)先隊列是一種 容器適配器 ,根據(jù)嚴格的弱排序標(biāo)準(zhǔn), 它的第一個元素總是它所包含的元素中最大的。 2. 此上下文類似于 堆 , 在堆中可以隨時插入元素,并且只能檢索最大堆元素(優(yōu)先隊列中位于頂部的元素)。 3. 優(yōu)先隊列被實現(xiàn)為容器適配

    2024年02月04日
    瀏覽(19)
  • 【C++】手撕 棧 & 隊列(適配器)

    【C++】手撕 棧 & 隊列(適配器)

    目錄 一,stack 1,stack的介紹 2,stack 框架 3,push(const T x) 4,pop() 5,top() 6,size() 7,empty() 8,stack 測試 9,源代碼 二,queue 1,queue的介紹 2,queue 框架 3,push(const T x) 4,pop() 5,front() 6,back() 7,size() 8,empty() 9,queue 測試 10,源代碼 三,總結(jié) 1,stack 是一種容器適配器,專門用

    2024年04月15日
    瀏覽(21)
  • 【C++】STL——反向迭代器的模擬實現(xiàn):迭代器適配器

    【C++】STL——反向迭代器的模擬實現(xiàn):迭代器適配器

    反向迭代器的使用相信大家都已經(jīng)比較熟悉了,那我們這篇文章具體講什么呢? ??,這篇文章我們重點來講一下 反向迭代器的模擬實現(xiàn) 。 那為什么我們之前不和正向迭代器放在一塊講呢?為什么要等到我們講完了容器適配器再來講反向迭代器的模擬實現(xiàn)呢? 那這個問題我

    2024年02月08日
    瀏覽(21)
  • C++初階:容器適配器介紹、stack和queue常用接口詳解及模擬實現(xiàn)

    C++初階:容器適配器介紹、stack和queue常用接口詳解及模擬實現(xiàn)

    介紹完了list類的相關(guān)內(nèi)容后:C++初階:適合新手的手撕list(模擬實現(xiàn)list) 接下來進入新的篇章,stack和queue的介紹以及模擬: stack是一種容器適配器,專門用在具有后進先出操作的上下文環(huán)境中,其刪除只能從容器的一端進行元素的插入與提取操作。 stack是作為容器適配器

    2024年02月19日
    瀏覽(25)
  • 【C++】STL反向迭代器模擬實現(xiàn),迭代器適配器,迭代器類型簡單介紹

    【C++】STL反向迭代器模擬實現(xiàn),迭代器適配器,迭代器類型簡單介紹

    本篇主要講反向迭代器的模擬實現(xiàn)。 能夠加深各位對泛型的理解。 前面我那篇string介紹里面已經(jīng)提到過反向迭代器是啥了,如果點進來的同學(xué)還不知道,可以看看:[string介紹](https://blog.csdn.net/m0_62782700/article/details/130796914? spm=1001.2014.3001.5501) 迭代器,可以在不暴露底層實現(xiàn)細

    2024年02月16日
    瀏覽(31)
  • 【C++】STL中stack,queue容器適配器的模擬實現(xiàn)(使用deque容器)

    【C++】STL中stack,queue容器適配器的模擬實現(xiàn)(使用deque容器)

    ??博客主頁: 主頁 ??系列專欄: C++ ??感謝大家點贊??收藏?評論?? ??期待與大家一起進步! 雖然stack和queue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因為stack和隊列只是對其他容器的接口進行了包裝,STL中stack和

    2024年02月15日
    瀏覽(31)
  • 【C++航海王:追尋羅杰的編程之路】priority_queue(優(yōu)先隊列) | 容器適配器你知道哪些?

    【C++航海王:追尋羅杰的編程之路】priority_queue(優(yōu)先隊列) | 容器適配器你知道哪些?

    目錄 1 -?priority_queue的介紹和使用 1.1 -?priority_queue的介紹 1.2 -?priority_queue的使用 1.3 -?priority_queue的模擬實現(xiàn) 2 - 容器適配器 2.1 - 什么是適配器 2.2 - STL標(biāo)準(zhǔn)庫中stack和queue的底層結(jié)構(gòu) 2.3 - deque的介紹 2.3.1 - deque的原理介紹 2.3.2 - deque的缺陷 2.4 - 為什么選擇deque作為stack和queue的底

    2024年04月10日
    瀏覽(46)
  • 深入篇【C++】手搓模擬實現(xiàn)list類(詳細剖析底層實現(xiàn)原理)&&模擬實現(xiàn)正反向迭代器【容器適配器模式】

    深入篇【C++】手搓模擬實現(xiàn)list類(詳細剖析底層實現(xiàn)原理)&&模擬實現(xiàn)正反向迭代器【容器適配器模式】

    1.一個模板參數(shù) 在模擬實現(xiàn)list之前,我們要理解list中的迭代器是如何實現(xiàn)的。 在vector中迭代器可以看成一個指針,指向vector中的數(shù)據(jù)。它的解引用會訪問到具體的數(shù)據(jù)本身,++會移動到下一個數(shù)據(jù)位置上去,這些都是因為vector具有天生的優(yōu)勢:空間上是連續(xù)的數(shù)組,這樣指

    2024年02月15日
    瀏覽(34)
  • 【C++】STL——容器適配器priority_queue(優(yōu)先級隊列)詳解 及 仿函數(shù)的介紹和使用

    【C++】STL——容器適配器priority_queue(優(yōu)先級隊列)詳解 及 仿函數(shù)的介紹和使用

    這篇文章我們接著上一篇的內(nèi)容,再來學(xué)一個STL里的容器適配器—— priority_queue (優(yōu)先級隊列) 1.1 priority_queue的介紹 我們上一篇文章學(xué)了 queue (隊列),那優(yōu)先級隊列也是在 queue 里面的: 和 queue 一樣, priority_queue 也是一個容器適配器,那他和 queue 有什么區(qū)別呢?我們一

    2024年02月07日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包