最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ deque/queue/stack的底層原理解析

 更新時(shí)間:2023年07月21日 16:09:54   作者:lliuhao--  
這篇文章主要介紹了C++ deque/queue/stack的底層原理解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

deque容器的存儲結(jié)構(gòu)

和 vector 容器采用連續(xù)的線性空間不同,deque 容器存儲數(shù)據(jù)的空間是由一段一段等長的連續(xù)空間構(gòu)成,各段空間之間并不一定是連續(xù)的,可以位于在內(nèi)存的不同區(qū)域。

deque采用一塊所謂的map數(shù)組(注意,不是STL的map容器)作為主控。這里所謂map是一小塊連續(xù)空間(類似于vector),其中每個(gè)元素(此處稱為一個(gè)節(jié)點(diǎn),node)都是指針,指向另一段(較大的)連續(xù)線性空間,稱為緩沖區(qū)。緩沖區(qū)才是deque的儲存空間主體。SGI STL 允許我們指定緩沖區(qū)大小,默認(rèn)值0表示將使用512 bytes 緩沖區(qū)。

通過建立 map 數(shù)組,deque 容器申請的這些分段的連續(xù)空間就能實(shí)現(xiàn)“整體連續(xù)”的效果。換句話說,當(dāng) deque 容器需要在頭部或尾部增加存儲空間時(shí),它會申請一段新的連續(xù)空間,同時(shí)在 map 數(shù)組的開頭或結(jié)尾添加指向該空間的指針,由此該空間就串接到了 deque 容器的頭部或尾部。

如果 map 數(shù)組滿了怎么辦?很簡單,再申請一塊更大的連續(xù)空間供 map 數(shù)組使用,將原有數(shù)據(jù)(很多指針)拷貝到新的 map 數(shù)組中,然后釋放舊的空間。

deque 容器的分段存儲結(jié)構(gòu),提高了在序列兩端添加或刪除元素的效率,但也使該容器迭代器的底層實(shí)現(xiàn)變得更復(fù)雜。

deque容器迭代器的底層實(shí)現(xiàn)

由于 deque 容器底層將序列中的元素分別存儲到了不同段的連續(xù)空間中,因此要想實(shí)現(xiàn)迭代器的功能,必須先解決如下 2 個(gè)問題:

  • 迭代器在遍歷 deque 容器時(shí),必須能夠確認(rèn)各個(gè)連續(xù)空間在 map 數(shù)組中的位置;
  • 迭代器在遍歷某個(gè)具體的連續(xù)空間時(shí),必須能夠判斷自己是否已經(jīng)處于空間的邊緣位置。如果是,則一旦前進(jìn)或者后退,就需要跳躍到上一個(gè)或者下一個(gè)連續(xù)空間中。

為了實(shí)現(xiàn)遍歷 deque 容器的功能,deque 迭代器定義了如下的結(jié)構(gòu):

template<class T,...>
struct __deque_iterator{
    ...
    T* cur;
    T* first;
    T* last;
    map_pointer node;//map_pointer 等價(jià)于 T**
}

可以看到,迭代器內(nèi)部包含 4 個(gè)指針,它們各自的作用為:

  • cur:指向當(dāng)前正在遍歷的元素;
  • first:指向當(dāng)前連續(xù)空間的首地址;
  • last:指向當(dāng)前連續(xù)空間的末尾地址;
  • node:它是一個(gè)二級指針,用于指向 map 數(shù)組中存儲的指向當(dāng)前連續(xù)空間的指針。

借助這 4 個(gè)指針,deque 迭代器對隨機(jī)訪問迭代器支持的各種運(yùn)算符進(jìn)行了重載,能夠?qū)?deque 分段連續(xù)空間中存儲的元素進(jìn)行遍歷。例如:

//當(dāng)?shù)魈幱诋?dāng)前連續(xù)空間邊緣的位置時(shí),如果繼續(xù)遍歷,就需要跳躍到其它的連續(xù)空間中,該函數(shù)可用來實(shí)現(xiàn)此功能
void set_node(map_pointer new_node){
    node = new_node;//記錄新的連續(xù)空間在 map 數(shù)組中的位置
    first = *new_node; //更新 first 指針
    //更新 last 指針,difference_type(buffer_size())表示每段連續(xù)空間的長度
    last = first + difference_type(buffer_size());
}
//重載 * 運(yùn)算符
reference operator*() const{return *cur;}
pointer operator->() const{return &(operator *());}
//重載前置 ++ 運(yùn)算符
self & operator++(){
    ++cur;
    //處理 cur 處于連續(xù)空間邊緣的特殊情況
    if(cur == last){
        //調(diào)用該函數(shù),將迭代器跳躍到下一個(gè)連續(xù)空間中
        set_node(node+1);
        //對 cur 重新賦值
        cur = first;
    }
    return *this;
}
//重置前置 -- 運(yùn)算符
self& operator--(){
    //如果 cur 位于連續(xù)空間邊緣,則先將迭代器跳躍到前一個(gè)連續(xù)空間中
    if(cur == first){
        set_node(node-1);
        cur == last;
    }
    --cur;
    return *this;
}

deque容器的底層實(shí)現(xiàn)

了解了 deque 容器底層存儲序列的結(jié)構(gòu),以及 deque 容器迭代器的內(nèi)部結(jié)構(gòu)之后,接下來看看 deque 容器究竟是如何實(shí)現(xiàn)的。

deque 容器除了維護(hù)先前講過的 map 數(shù)組,還需要維護(hù) start、finish 這 2 個(gè) deque 迭代器。以下為 deque 容器的定義:

//_Alloc為內(nèi)存分配器
template<class _Ty,
    class _Alloc = allocator<_Ty>>
class deque{
    ...
protected:
    iterator start;
    iterator finish;
    map_pointer map;
...
}

其中,start 迭代器記錄著 map 數(shù)組中首個(gè)連續(xù)空間的信息,finish 迭代器記錄著 map 數(shù)組中最后一個(gè)連續(xù)空間的信息。另外需要注意的是,和普通 deque 迭代器不同,start 迭代器中的 cur 指針指向的是連續(xù)空間中首個(gè)元素;而 finish 迭代器中的 cur 指針指向的是連續(xù)空間最后一個(gè)元素的下一個(gè)位置。

因此,deque 容器的底層實(shí)現(xiàn)如下圖所示:

借助 start 和 finish,以及 deque 迭代器中重載的諸多運(yùn)算符,就可以實(shí)現(xiàn) deque 容器提供的大部分成員函數(shù),比如:

//begin() 成員函數(shù)
iterator begin() {return start;}
//end() 成員函數(shù)
iterator end() { return finish;}
//front() 成員函數(shù)
reference front(){return *start;}
//back() 成員函數(shù)
reference back(){
    iterator tmp = finish;
    --tmp;
    return *tmp;
}
//size() 成員函數(shù)
size_type size() const{return finish - start;}//deque迭代器重載了 - 運(yùn)算符
//enpty() 成員函數(shù)
bool empty() const{return finish == start;}

stack和queue的原理

由stack和queue源碼可知,其實(shí)stack和queue是將deque容器進(jìn)行再封裝,其底層是一個(gè)deque容器。對stack和queue操作,其實(shí)間接操作的是deque容器。

到此這篇關(guān)于C++ deque/queue/stack的底層原理的文章就介紹到這了,更多相關(guān)C++ deque/queue/stack的底層原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言安全之?dāng)?shù)組長度與指針實(shí)例解析

    C語言安全之?dāng)?shù)組長度與指針實(shí)例解析

    這篇文章主要介紹了C語言安全之?dāng)?shù)組長度與指針,需要的朋友可以參考下
    2014-07-07
  • Qt與QWebEngineView交互完整參考示例代碼

    Qt與QWebEngineView交互完整參考示例代碼

    QWebEngineView是Qt框架中的一個(gè)組件,它是基于Chromium內(nèi)核的Web瀏覽器引擎,用于在Qt應(yīng)用程序中嵌入網(wǎng)頁內(nèi)容和實(shí)現(xiàn)各種Web應(yīng)用功能,這篇文章主要給大家介紹了關(guān)于Qt與QWebEngineView交互完整參考的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--定點(diǎn)數(shù)的加減乘除運(yùn)算

    DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--定點(diǎn)數(shù)的加減乘除運(yùn)算

    本文主要介紹DSP中定點(diǎn)數(shù)的加減乘除運(yùn)算,很值得學(xué)習(xí)一下,需要的朋友可以參考一下。
    2016-06-06
  • C語言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    C語言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    楊輝三角是中國古代數(shù)學(xué)的杰出研究成果之一,它把二項(xiàng)式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來,是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實(shí)現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試
    2022-01-01
  • VC++的combobox控件用法匯總

    VC++的combobox控件用法匯總

    這篇文章主要介紹了VC++的combobox控件用法,對VC++初學(xué)者來說尤為重要,需要的朋友可以參考下
    2014-08-08
  • C++實(shí)現(xiàn)哈夫曼樹算法

    C++實(shí)現(xiàn)哈夫曼樹算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)哈夫曼樹的具體代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言結(jié)構(gòu)體的全方面解讀

    C語言結(jié)構(gòu)體的全方面解讀

    C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項(xiàng)
    2021-10-10
  • C語言文件隨機(jī)讀寫的完全指南

    C語言文件隨機(jī)讀寫的完全指南

    本文詳細(xì)介紹了C語言中實(shí)現(xiàn)文件隨機(jī)讀寫的關(guān)鍵函數(shù)(fseek, ftell, rewind)及其應(yīng)用,通過移動文件光標(biāo),隨機(jī)讀寫允許直接訪問文件的任意位置,適用于數(shù)據(jù)庫、日志文件等場景,需要的朋友可以參考下
    2025-10-10
  • C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形)

    C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Linux?C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息

    Linux?C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息

    NIC流量統(tǒng)計(jì)信息是由操作系統(tǒng)維護(hù)的,當(dāng)數(shù)據(jù)包通過NIC傳輸時(shí),操作系統(tǒng)會更新相關(guān)的計(jì)數(shù)器,通過讀取這些計(jì)數(shù)器,我們可以獲得關(guān)于網(wǎng)絡(luò)流量的信息,下面我們就來學(xué)習(xí)一下如何通過C/C++實(shí)現(xiàn)顯示NIC流量統(tǒng)計(jì)信息吧
    2024-01-01

最新評論

呼和浩特市| 福海县| 左权县| 扶沟县| 安龙县| 芮城县| 赫章县| 全南县| 周口市| 夹江县| 屏东市| 山丹县| 健康| 玉田县| 崇礼县| 扬州市| 宁都县| 穆棱市| 蛟河市| 涞水县| 大埔区| 崇州市| 宁蒗| 岗巴县| 芦溪县| 土默特右旗| 历史| 宜宾县| 涡阳县| 吉隆县| 柯坪县| 赤壁市| 嘉峪关市| 株洲市| 射洪县| 黑山县| 乐陵市| 阳春市| 西安市| 怀化市| 华容县|