日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

C++ STL : 模拟实现STL中的容器适配器stack和queue

發(fā)布時(shí)間:2024/4/11 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ STL : 模拟实现STL中的容器适配器stack和queue 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

    • 什么是容器適配器
    • stack
      • stack的文檔介紹-(來(lái)自cplusplus)
      • stack的實(shí)現(xiàn)
    • queue
      • queue的文檔介紹-(來(lái)自cplusplus)
      • queue的實(shí)現(xiàn)


什么是容器適配器

之前模擬實(shí)現(xiàn)的vector,string,list等都是容器,而這次要實(shí)現(xiàn)的stack和queue則是容器適配器,那么什么是容器適配器呢?
適配器其實(shí)就是一個(gè)轉(zhuǎn)換裝置,這種東西在生活中非常常見(jiàn)。例如將USB接口轉(zhuǎn)為Type-c接口,就可以在手機(jī)上用U盤,又或者三腳插頭轉(zhuǎn)二腳插頭,方便使用更多的插座。適配器的作用就是在不更換設(shè)備的情況下,能讓我們的設(shè)備適用于其他情景,或者擁有別的功能。
在STL中,stack和queue其實(shí)就是傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)中的棧和隊(duì)列,我們并不關(guān)心他的底層是什么,因?yàn)槲覀?strong>只需要保證他具有后進(jìn)先出和先進(jìn)先出的特點(diǎn)即可,這個(gè)特點(diǎn),無(wú)論是使用vector,還是list都可以實(shí)現(xiàn),既然這樣,那就干脆將其作為一個(gè)適配器,不需要再創(chuàng)建新的容器,而是直接在原有的容器上實(shí)現(xiàn)他的特性即可,并且這個(gè)容器可以有多種選擇。


stack

stack的文檔介紹-(來(lái)自cplusplus)

  • stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行 元素的插入與提取操作。
  • stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器即是對(duì)特定類封裝作為其底層的容器,并提供一組特定 的成員函數(shù)來(lái)訪問(wèn)其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出。
  • stack的底層容器可以是任何標(biāo)準(zhǔn)的容器類模板或者一些其他特定的容器類,這些容器類應(yīng)該支持以下 操作: empty:判空操作 back:獲取尾部元素操作 push_back:尾部插入元素操作 pop_back:尾部刪除元素操作
  • 標(biāo)準(zhǔn)容器vector、deque、list均符合這些需求,默認(rèn)情況下,如果沒(méi)有為stack指定特定的底層容器, 默認(rèn)情況下使用deque。

  • stack的實(shí)現(xiàn)

    stack的實(shí)現(xiàn)其實(shí)就是棧的實(shí)現(xiàn),只需要在復(fù)用原有代碼的基礎(chǔ)上增加stl的特性即可,
    下面是之前數(shù)據(jù)結(jié)構(gòu)篇章時(shí)實(shí)現(xiàn)的棧
    棧的實(shí)現(xiàn)

    庫(kù)中默認(rèn)選擇的容器是deque

    #include<deque>namespace lee {/*STL底層中的容器選擇的是deque,因?yàn)閐eque是假想的連續(xù)空間,他每次插入時(shí)擴(kuò)容都會(huì)直接在插入的地方直接插入一片固定大小的空間,這樣就保證了邏輯上的線性,不需要拷貝數(shù)據(jù)。而vector每次擴(kuò)容,都需要?jiǎng)?chuàng)建新空間,拷貝原數(shù)據(jù),銷毀原空間,并且開(kāi)的空間是原數(shù)據(jù)的1.5倍或2倍(不同版本)vector不僅效率不比deque高,空間的利用率也不高,多次擴(kuò)容會(huì)導(dǎo)致空間的碎片化*/template<class T, class Container = std::deque<T>>class stack{public:void push(const T& val){_con.push_back(val);}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;}; }

    queue

    queue的文檔介紹-(來(lái)自cplusplus)

  • 隊(duì)列是一種容器適配器,專門用于在FIFO上下文(先進(jìn)先出)中操作,其中從容器一端插入元素,另一端 提取元素。
  • 隊(duì)列作為容器適配器實(shí)現(xiàn),容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的 成員函數(shù)來(lái)訪問(wèn)其元素。元素從隊(duì)尾入隊(duì)列,從隊(duì)頭出隊(duì)列。
  • 底層容器可以是標(biāo)準(zhǔn)容器類模板之一,也可以是其他專門設(shè)計(jì)的容器類。該底層容器應(yīng)至少支持以下操 作: empty:檢測(cè)隊(duì)列是否為空 size:返回隊(duì)列中有效元素的個(gè)數(shù) front:返回隊(duì)頭元素的引用 back:返回隊(duì)尾元素的引用 push_back:在隊(duì)列尾部入隊(duì)列
    pop_front:在隊(duì)列頭部出隊(duì)列
  • 標(biāo)準(zhǔn)容器類deque和list滿足了這些要求。默認(rèn)情況下,如果沒(méi)有為queue實(shí)例化指定容器類,則使用標(biāo) 準(zhǔn)容器deque。

  • queue的實(shí)現(xiàn)

    隊(duì)列的實(shí)現(xiàn)

    庫(kù)中默認(rèn)選擇的容器是deque

    #include<deque>namespace lee {/*STL中queue底層的容器是deque,因?yàn)閐eque和list一樣插入刪除的效率都是O(1),并且deque的效率更高,因?yàn)閘ist是一次創(chuàng)建一個(gè)結(jié)點(diǎn)后插入,并且這些空間是離散分布的.deque是每次創(chuàng)建一個(gè)固定大小的空間,并在這塊空間上面進(jìn)行插入刪除,這樣的效率更高,并且因?yàn)樯暾?qǐng)的空間都是一段一段的連續(xù)空間,內(nèi)存的利用率更高*/template<class T, class Container = std::deque<T>>class queue{public:void push(const T& val){_con.push_back(val);}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;}; }

    總結(jié)

    以上是生活随笔為你收集整理的C++ STL : 模拟实现STL中的容器适配器stack和queue的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。