日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

STL容器之Deque-《C++标准库(第二版)》读书笔记

發(fā)布時(shí)間:2025/4/5 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL容器之Deque-《C++标准库(第二版)》读书笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫在前面:本文是閱讀《C++標(biāo)準(zhǔn)庫(第二版)》的讀書筆記。

文章目錄

    • 7.4 Deque
      • 7.4.1 Deque的能力
      • 7.4.2 Deque的操作函數(shù)
      • 7.4.3 Exception Handling
      • 7.4.4 Deque運(yùn)用實(shí)例

7.4 Deque

容器deque(發(fā)音為“deck”)和vector非常相似。它也采用dynamic array來管理元素,提供隨機(jī)訪問,并有著和vector幾乎一模一樣的接口。不同的是deque的dynamic array頭和尾都開放,因此能在頭尾兩端進(jìn)行快速安插和刪除。

為了提供這種能力,deque通常實(shí)現(xiàn)為一組獨(dú)立區(qū)塊(a bunch of individual blocks) ,第一區(qū)塊朝向某方向擴(kuò)展,最后的區(qū)塊朝另一方向擴(kuò)展。

使用deque之間,必須先包含頭文件< deque> :#include< deque>
其中,deque類型定義于命名空間std內(nèi)的一個(gè) class template:

namespace std{tamplate< typename T,typename Allocator = allocator<T>>class deque; }

和vector相同,這里的第一個(gè)template參數(shù)用來指明元素類型,第二個(gè)template實(shí)參可有可無,用來指定內(nèi)存模型(memory model),默認(rèn)為allocator.

7.4.1 Deque的能力

Deque和vector相比,功能上的差異如下:

  • 兩端都能快速安插元素和移除元素(vector只能在尾部可以)。這些操作可以在攤提的常量時(shí)間內(nèi)完成。
  • 訪問元素時(shí)deque內(nèi)部結(jié)構(gòu)會(huì)多一個(gè)間接過程,所以元素的訪問和迭代器的動(dòng)作會(huì)稍微慢一些。
  • 迭代器需要在不同的區(qū)塊間跳轉(zhuǎn),所以必須是個(gè)smart pointer,不能是個(gè)普通的pointer。
  • 在內(nèi)存區(qū)塊大小有限制的系統(tǒng)中,deque可以內(nèi)含更多元素,因?yàn)樗褂貌恢挂粔K內(nèi)存。因此deque的max_size()可能更大。
  • Deque不支持對(duì)容量和內(nèi)存重新分配時(shí)機(jī)的控制。特別要注意的是,除了頭尾兩端,在任何地點(diǎn)安插和刪除元素都將導(dǎo)致指向deque元素的任何pointer、reference和iterator失效。不過,deque 的內(nèi)存重分配由于vector,因?yàn)槠鋬?nèi)部結(jié)構(gòu)顯示,deque不必在內(nèi)存重新分配時(shí)復(fù)制所有元素。
  • Deque會(huì)釋放不再使用的內(nèi)存區(qū)塊。deque的內(nèi)存大小使可所建的,但要不要這么做,以及如何做,由實(shí)現(xiàn)決定。
  • Deque的的以下特性和vector差不多:

  • 在中段安插、移除元素的速度相對(duì)較慢,因?yàn)樗性囟夹枰苿?dòng)以騰出或者填補(bǔ)空間。
  • 迭代器屬于random-access iterator(隨機(jī)訪問迭代器)。
  • 總之,以下情形最好使用deque:

    • 你需要在兩端安插和刪除元素(這是deque的拿手好戲)。
    • 無需指向容器內(nèi)的元素。
    • 要求”不再使用的元素必須釋放“(不過,C++ standard 對(duì)此無任何保證)。

    7.4.2 Deque的操作函數(shù)

    下面列出了deque的操作函數(shù)。

    deque的各項(xiàng)操作只有以下兩點(diǎn)和vector不同:

  • deque不提供容量操作 (capacity()和reserve()).
  • deque直接提供函數(shù)完成頭部元素的安插和刪除(push_front()和pop_front())。
  • 其他操作都相同。

    請(qǐng)注意,C++11 添加了 shrink_to_fit() ,那是個(gè)不具有強(qiáng)制力(nonbinding)的函數(shù),負(fù)責(zé)縮小內(nèi)部內(nèi)存以匹配元素個(gè)數(shù)。你可能會(huì)認(rèn)為shrink_to_fit()對(duì)deque沒意義,因?yàn)閐eque本來就會(huì)釋放不再使用的區(qū)塊內(nèi)存。然而,deque內(nèi)部用來存放”指向獨(dú)立區(qū)塊“的所有pointer的空間,通常不會(huì)被縮小,如果用了這個(gè)函數(shù)就有可能真的被縮小。

    還有一些值得考慮的事情:

  • 除了at(),沒有任何成員函數(shù)會(huì)檢查”索引或迭代器是否有效“。
  • 除了頭尾兩端,在任何地點(diǎn)安插和刪除元素都將導(dǎo)致指向deque元素的任何pointer、reference和iterator失效。
  • 7.4.3 Exception Handling

    原則上deque提供的異常處理和vector提供的一樣。新增的操作函數(shù)push_front()和pop_front()分別對(duì)應(yīng)于push_back()和pop_back()。因此C++標(biāo)準(zhǔn)庫保證下列行為:
    如果以push_back() 、 push_front()安插元素時(shí)發(fā)生異常,則該操作不帶來任何效應(yīng)。
    pop_back()和 pop_front() 不會(huì)拋出任何異常。

    7.4.4 Deque運(yùn)用實(shí)例

    #include<iostream> #include<deque> #include<iterator> #include<algorithm> #include<string> using namespace std;int main(){//create empty deque of stringsdeque<string> coll;//insert several elementscoll.assign(3,string("string"));//復(fù)制3個(gè) ”string“ ,賦值給coll coll.push_back("last string") ; //尾部添加一個(gè)字符串 coll.push_front("first string"); //頭部添加一個(gè)字符串 //print elements separated by newlinescopy( coll.cbegin(),coll.cend(),ostream_iterator<string>(cout,"\n"));cout<<endl;//remove first and last elementcoll.pop_back();coll.pop_front();//insert "another" into every element but the firstfor(int i=1; i<coll.size();i++)coll[i]="another"+coll[i];// change size to four elementscoll.resize(4,"resized string"); //將元素?cái)?shù)量改為4,如果size()變大,多出來的新元素都是”resized string“的拷貝 //print elements separated by newlinescopy( coll.cbegin(),coll.cend(),ostream_iterator<string>(cout,"\n"));cout<<endl;}

    輸出結(jié)果

    總結(jié)

    以上是生活随笔為你收集整理的STL容器之Deque-《C++标准库(第二版)》读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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