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