音視頻開發(fā)之旅(22) STL 之 容器

目錄

  1. STL的六大部件介紹
  2. 容器分類
  3. 序列式容器介紹(vector、list、deque)
  4. 關(guān)聯(lián)式容器
  5. 資料
  6. 收獲

一、STL六大部件

STL:cpp standard library cpp標準庫

STL的六大部件compounts:

  1. 容器 (Containers)
  2. 分配器(Allocators)
  3. 算法(Algorithms)
  4. 迭代器(Iteratros)
  5. 適配器(Adapters)
  6. 仿函數(shù)(Functors)

其中比較重要或者常用的部件是:容器、算法、迭代器、仿函數(shù)
迭代器是連接容器和算法的橋梁,仿函數(shù)是對“()”的操作符重載。接下來我們會重點學(xué)習(xí)實踐容器和算法。而本篇主要介紹各種容器的特性。

二、容器分類

容器從內(nèi)存分配是否是連續(xù)上來劃分,可以分為序列式容器和關(guān)聯(lián)式容器以及無序容器。

序列式容器:強調(diào)值的排序,每個元素都有固定的位置

包含以下幾種容器類型:

  1. Array(數(shù)組 固定大小)
  2. Vector(向量 會自動擴充)、
  3. Deque(雙向隊列,前后都可以擴充)
  4. List:鏈表(雙向鏈表)
  5. Forward-list:(單項鏈表)

關(guān)聯(lián)式容器:二叉樹結(jié)構(gòu),各元素之間沒有嚴格的物理上的順序關(guān)系。
使用場景:大量查找

包含以下幾種容器:

  1. Set/Multiset
  2. Map/Multimap :key-Value

其中 Set 和Map 元素內(nèi)容不可以重復(fù),Multiset和Multimap 元素內(nèi)容可重復(fù)

內(nèi)部是高度平衡的樹即紅黑樹結(jié)構(gòu)


無序容器
HashTable Separate Chaining

三、序列式容器介紹(vector、list、deque)

3.1 vector

Vector和普通數(shù)組的區(qū)別在于,數(shù)組是靜態(tài)空間,vector是動態(tài)擴展。這里的動態(tài)擴展并不是在原空間之后續(xù)接新空間,而是尋找更大的內(nèi)存空間,以兩倍增長的方式 ,將原數(shù)據(jù)拷貝過去。

獲取數(shù)據(jù)的方式

[]
at
front
back

容器互換: swap()
查看容器的容量: capacity()
重新制定vector容器大小: resize()

3.2 list 鏈表

鏈表是由一個個節(jié)點組成,節(jié)點包含 數(shù)據(jù)域和指針域。

優(yōu)點:對任意位置可以快速添加刪除數(shù)據(jù),只需要改變節(jié)點指針域的指向,而不用移動后續(xù)位置;大小比較靈活,不用想vector的雙倍擴展
缺點:遍歷速度沒有連續(xù)的array塊;由于指針域的存在,占用的空間比array大。

Stl中的鏈表是一個雙向循環(huán)鏈表。鏈表的迭代器只能前移或后移,不能跳躍

前加加: operator++() 返回值是self&
后加加: operator++(int) 返回值是self

3.3 deque容器

雙端數(shù)組,可以對頭端進香插入刪除操作,deque內(nèi)存上是分段連續(xù)的


順序容器適配器棧stack 內(nèi)部是deque實現(xiàn)
先進后出


順序容器適配器 隊列queue 先進先出,內(nèi)部也是deque實現(xiàn)

常用的方法如下:

賦值操作

=
assign(begin,end)
assign(n,num)

大小

deque.empty() 
deque.size()
deque.resize(num)
deque.resize(num,elem)

沒有容量capacity
void printDeuqe(const deque<int &d>)
{
    for(deque<int>::const_iterator it =d.begin();it !=d.end();it++)
    {
        cout << *it << "";
    }
    cout <<endl;
}

插入刪除

//在容器尾部添加一個數(shù)據(jù)
push_back(elem);

//在容器頭部添加一個容器
push_front(elem);

//刪除容器的最后一個數(shù)據(jù)
pop_back();

//刪除容器的第一個數(shù)據(jù)
pop_front();

//在pos位置插入一個elem元素的拷貝,返回新數(shù)據(jù)的位置
insert(pos,elem);
//在pos位置插入【beg,end)區(qū)間的數(shù)據(jù)
insert(pos,beg,end);

clear();
erase(pos);
erase(beg,end);

數(shù)據(jù)存取

//返回索引pos所指的數(shù)據(jù)
at(int pos);
opeartor[];
//返回容器中第一個數(shù)據(jù)元素
front();
//返回容器最后一個數(shù)據(jù)元素
back();

排序

//對beg和end區(qū)間內(nèi)元素進行排序
sort(iterator beg, iterator end)

四、關(guān)聯(lián)性容器

可以理解為 小型的關(guān)聯(lián)型數(shù)據(jù)庫

4.1 set/multiset容器

容器set中所有的元素插入時候會自動排序,其中set不允許重復(fù)值;multiset可以重復(fù)。

賦值
插入數(shù)據(jù)使用insert

賦值構(gòu)造
拷貝構(gòu)造

查找和統(tǒng)計

//查找key是否存在,如存在,返回該鍵的元素的迭代器;如不存在返回set.end()

find(key);

//統(tǒng)計key的元素個數(shù),對于set返回值是0或1. 
count(key);

排序

利用仿函數(shù),改變排序規(guī)則

仿函數(shù) 重載(),記得加const
如: bool opeartor()(int x, int y) const;

class Mycompare
{
public:
    bool operator()(int v1,int v2)
    {
        return v1 >v2;
    }
}

對于自定義的數(shù)據(jù)類型排序,要使用仿函數(shù)制定排序規(guī)則。
set<Object,MyCompare>

4.2 map/multimap容器

map中所有元素都是pair,其中Pair的第一元素是key,起到索引作用,第二個元素是value,所有元素都會根據(jù)元素的key自動排序。

另外容器的迭代器采用左閉右開的區(qū)間編程


這篇就到這里,了解stl的六大組件,容器的分類,以及各種容器的特點,常用方法以及部分使用場景。從下一篇開始開始學(xué)習(xí)實踐算法,一起來學(xué)習(xí)吧。

五、資料

  1. 《Tinking in C++》
  2. 《C++Primer》
  3. [侯捷C++ STL 體系結(jié)構(gòu)與內(nèi)核分析] : https://www.bilibili.com/video/BV1db411q7B8?from=search&seid=653949808386505225 上面的圖片均來自于該資源。

六、收獲

  1. 了解stl的六大組件
  2. 了解序列式容器和關(guān)聯(lián)式容器的分類
  3. 了解各種容器的特點,常用方法,和優(yōu)缺點。

感謝你的閱讀
下一篇我們開始進入算法章節(jié)的學(xué)習(xí)實踐,在這也立個flag,每天更新一種類型的算法(遍歷、查找、排序、拷貝、替換等),這些基礎(chǔ)知識非常重要,來一起學(xué)習(xí)吧。 歡迎關(guān)注公眾號“音視頻開發(fā)之旅”,一起學(xué)習(xí)成長。
歡迎交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內(nèi)容

  • 對于標準庫來說,容器是非常大的一塊內(nèi)容,那么之前已經(jīng)談過關(guān)于list、vector、array、forward_l...
    故事狗閱讀 599評論 0 0
  • 容器的概念所謂STL容器,即是將最常運用的一些數(shù)據(jù)結(jié)構(gòu)(data structures)實現(xiàn)出來。容器是指容納特定...
    飯飯H閱讀 388評論 0 0
  • 容器 在實際的開發(fā)過程中, 數(shù)據(jù)結(jié)構(gòu)本身的重要性不會遜于操作于數(shù)據(jù)結(jié)構(gòu)的算法的重要性, 當程序中存在著對時間要求很...
    編程小兔崽閱讀 1,098評論 0 1
  • STL容器類型 序列式容器:vector,list(雙向鏈表),deque,stack,queue,heap,pr...
    Catcher07閱讀 681評論 0 0
  • STL包括容器,算法和迭代器 STL的模板類為c++提供了完善的數(shù)據(jù)結(jié)構(gòu),它的模板類的樣式就好象數(shù)據(jù)結(jié)構(gòu)中用類c或...
    元素周期表的十七君閱讀 549評論 0 1