舉個例子:在日常生活中,當(dāng)手機沒電了,我們需要給手機充電,給手機充電的方式很多,可以插到電源上,也可以用充電寶,還可以直接連著電腦充。而我們并不關(guān)心用什么給它充電,我們關(guān)心的只是能否給手機充上電。適配器充當(dāng)?shù)慕巧褪?給手機充電的接口,它會將不同大小的電壓轉(zhuǎn)化成適合給手機充電的電壓。容器適配器的概念可以結(jié)合這個例子理解,它以 某種容器作為底層結(jié)構(gòu),改變其接口,使它符合該容器的特性。
下面將介紹三個用到容器適配器的結(jié)構(gòu):stack棧,queue隊列,priority_queue優(yōu)先級隊列,通過這三個結(jié)構(gòu),我們可以更好的理解容器適配器的用途。
二.理解容器適配器我們可以看出雖然stack,queue,priority_queue中也可以存放數(shù)據(jù),但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器配接器,這是因為stack,queue,priority_queue只是對其它容器的接口進行了包裝,STL中stack和queue默認(rèn)使用deque,priority_queue默認(rèn)使用vector作為容器。我們現(xiàn)在來看看它們的底層接口和實現(xiàn)
知道了容器適配器后,stack的模擬實現(xiàn)就簡單了,我們只需要調(diào)用指定容器deque的各個成員函數(shù)即可實現(xiàn)stack的各個函數(shù)接口。
底層實現(xiàn)代碼如下:stack底層利用deque雙端隊列進行包裝,需要更改成多參數(shù)模板,最便利的一點就是,stack的底層函數(shù)的實現(xiàn)可以直接調(diào)用容器的函數(shù)接口,不需要自己再一步步實現(xiàn)。
namespace nn //命名空間域:防止命名沖突
{//多參數(shù)模板
template>//可以明顯看出stack配接器的底層容器是deque雙端隊列,后面會介紹
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//const修飾
{ return _con.back();
}
//獲取棧中有效元素個數(shù)
size_t size() const
{ return _con.size();
}
//判斷棧是否為空
bool empty() const
{ return _con.empty();
}
//交換兩個棧中的數(shù)據(jù)
void swap(stack& st)//注意stack才是類型,加引用,別名,減少拷貝
{ _con.swap(st._con);//調(diào)用deque的算法swap
}
private:
//deque_con底層
Container _con;//將一個類的接口轉(zhuǎn)換成用戶需要的另一種接口,即利用deque容器轉(zhuǎn)換成stack配接器
};
}
queue的模擬實現(xiàn)同樣的方式,我們也是通過調(diào)用所指定容器的各個成員函數(shù)來實現(xiàn)queue的。
底層實現(xiàn)代碼如下:
namespace nn //防止命名沖突
{template>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();
}
//獲取隊列中有效元素個數(shù)
size_t size() const
{ return _con.size();
}
//判斷隊列是否為空
bool empty() const
{ return _con.empty();
}
//交換兩個隊列中的數(shù)據(jù)
void swap(queue& q)
{ _con.swap(q._con);
}
private:
Container _con;//deque_con;
};
}
思考stack 和 queue 是否存在迭代器?
stack 和 queue 都不具備迭代器, 因為兩者都不具備遍歷走訪功能,所以自然不需要設(shè)計迭代器
stack 和 queue可以以哪些容器作為底層容器?
實際上stack使用vector作為底層容器也是可以的,queue使用deque雙端隊列+list帶頭雙向循環(huán)鏈表作為底層容器也是可以的。
但是deque在設(shè)計上相比于list和vector,作為stack,queue的底層結(jié)構(gòu)更優(yōu)。
底層容器如何傳進去?
作為模板參數(shù)傳入template
,用了默認(rèn)參數(shù)(缺省參數(shù))
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧