柚子快報激活碼778899分享:queue的模擬實現(xiàn)【C++】
文章目錄
全部的實現(xiàn)代碼放在了文章末尾什么是適配器模式?準(zhǔn)備工作包含頭文件定義命名空間類的成員變量
默認(rèn)成員函數(shù)emptysizefrontbackpushpop全部代碼
全部的實現(xiàn)代碼放在了文章末尾
queue的模擬實現(xiàn)和stack一樣,采用了C++適配器模式
queue的適配器一般是deque,也可以是list
因為queue是有特殊限制的線性表【只能在隊頭刪除,隊尾插入】,所以只要是線性結(jié)構(gòu)并且可以高效的實現(xiàn)頭插和尾刪的線性表,就都可以作為queue的適配器
什么是適配器模式?
適配器模式是一種設(shè)計模式,它允許將不兼容接口的類一起工作。
適配器模式通常用于以下情況:
希望使用一個類,但其接口與其他代碼不兼容。希望創(chuàng)建一個可重用的類,它能夠?qū)⒔涌谵D(zhuǎn)換為其他接口。希望使用第三方庫或遺留代碼,但其接口與其他代碼不兼容。
適配器模式通常包括以下三個主要部分:
目標(biāo)接口(Target):這是期望使用的接口,客戶端代碼只能與目標(biāo)接口交互。源接口(Adaptee):這是需要適配的類,其接口與目標(biāo)接口不兼容。適配器(Adapter):這是一個類,它實現(xiàn)了目標(biāo)接口,并將調(diào)用轉(zhuǎn)換為對源接口的調(diào)用。適配器將源接口的調(diào)用轉(zhuǎn)換為目標(biāo)接口的調(diào)用,使得客戶端代碼可以與目標(biāo)接口交互。
可以類比我們生活中的家庭電源接口和筆記本電腦充電口與電源適配器,它們之間也是一種適配器關(guān)系
筆記本電腦充電口是上面提到的目標(biāo)接口 家庭電源接口是上面提到的源接口 電源適配器是上面提到的適配器
筆記本電腦的充電口是不能和家庭電源接口直接連接進(jìn)行充電的,因為筆記本電腦用的是直流電,而家庭電源輸出的是交流電,所以要把交流電轉(zhuǎn)換為直流電才能給筆記本電腦供電,而電源適配器就能做到這一點
對應(yīng)了上面提到的適配器模式解決的問題: 可以將不兼容接口的類一起工作
準(zhǔn)備工作
創(chuàng)建兩個文件,一個頭文件myqueue.hpp,一個源文件test.cpp
【因為模板的聲明和定義不能分處于不同的文件中,所以把成員函數(shù)的聲明和定義放在了同一個文件myqueue.hpp中】
myqueue.hpp:存放包含的頭文件,命名空間的定義,成員函數(shù)和命名空間中的函數(shù)的定義 test.cpp:存放main函數(shù),以及測試代碼
包含頭文件
iostream:用于輸入輸出 list:提供list類型的適配對象 deque: 提供deque類型的適配對象
定義命名空間
在文件myqueue.hpp中定義上一個命名空間myqueue 把queue類和它的成員函數(shù)放進(jìn)命名空間封裝起來,防止與包含的頭文件中的函數(shù)/變量重名的沖突問題
類的成員變量
只有一個,是適配器對象,默認(rèn)con是deque類型
默認(rèn)成員函數(shù)
和stack類的模擬實現(xiàn)的時候一樣 queue的四大默認(rèn)成員函數(shù):構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),析構(gòu)函數(shù),賦值運算符重載,都不需要手動寫,使用編譯器提供的默認(rèn)的即可
因為編譯器給的默認(rèn)的這四大成員函數(shù),都有一個特性: 如果類的成員變量是其他類實例化的對象,調(diào)用本類的四大默認(rèn)成員函數(shù)的時候,對其他類實例化的對象進(jìn)行操作時就可以自動調(diào)用那個類自己的四大默認(rèn)成員函數(shù)
empty
因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
所以判斷適配器對象是否為空即可
加const是為了讓const修飾的對象也能調(diào)用
bool empty()const
{
return _obj.empty();
}
size
因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
所以適配器對象的size,就是queue的size
加const是為了讓const修飾的對象也能調(diào)用
size_t size()const
{
return _obj.size();
}
front
因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
所以適配器對象中的第一個數(shù)據(jù),就是隊頭的數(shù)據(jù)
T& front()
{
return _obj.front();
}
const修飾的對象只能調(diào)用const修飾的成員函數(shù)
const T& front()const
{
return _obj.front();
}
back
因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
所以適配器對象中的最后一個數(shù)據(jù),就是隊尾的數(shù)據(jù)
T& back()
{
return _obj.back();
}
const修飾的對象只能調(diào)用const修飾的成員函數(shù)
把返回值改成,const T&類型,防止修改
const T& back()const
{
return _obj.back();
}
push
因為 要把 queue的數(shù)據(jù)都存儲在適配器對象里面
所以push就是尾插
void push(const T&val)
{
_obj.push_back(val);
}
pop
因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
所以刪除隊頭,就是適配器對象的頭刪
void pop()
{
_obj.pop_front();
}
全部代碼
#include
#include
#include
using namespace std;
namespace myqueue
{
//T是queue里面存儲的數(shù)據(jù)的類型
//con是適配器的類型
template
class queue
{
private:
//使用適配器類 實例化的 適配器對象
con _obj;
public:
//因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
//所以判斷適配器對象是否為空即可
bool empty()const
{
return _obj.empty();
}
//因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
//所以適配器對象的size,就是queue的size
size_t size()const
{
return _obj.size();
}
//因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
//所以適配器對象中的第一個數(shù)據(jù),就是隊頭的數(shù)據(jù)
T& front()
{
return _obj.front();
}
//const修飾的對象只能調(diào)用const修飾的成員函數(shù)
//把返回值改成,const T&類型,防止修改
const T& front()const
{
return _obj.front();
}
//因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
//所以適配器對象中的最后一個數(shù)據(jù),就是隊尾的數(shù)據(jù)
T& back()
{
return _obj.back();
}
//const修飾的對象只能調(diào)用const修飾的成員函數(shù)
//把返回值改成,const T&類型,防止修改
const T& back()const
{
return _obj.back();
}
//因為 要把 queue的數(shù)據(jù)都存儲在適配器對象里面
//所以push就是尾插
void push(const T&val)
{
_obj.push_back(val);
}
//因為把queue的數(shù)據(jù)都存儲在了適配器對象里面
//所以刪除隊頭,就是適配器對象的頭刪
void pop()
{
_obj.pop_front();
}
};
}
柚子快報激活碼778899分享:queue的模擬實現(xiàn)【C++】
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。