我想很多從别的進階語言轉過來剛接觸C++的時候一定會覺得C++賊不好用,最簡單的資料類型,比如動态數組、字典都沒有,這樣在日常開發中使用起來十分麻煩,那是因為大家還沒有接觸到C++的STL(standard template library)标準模闆庫,是建立在基礎資料結構基礎上的實作的包含資料容器、疊代器、算法等強大的元件庫。
這篇文章主要是全面的給大家分享一下STL序列容器總的一些知識,讓大家有一個簡單的了解,本文并沒有詳細的用法描述,所謂序列容器就是在這個容器中的所有資料是有前後順序的。下面就讓我們來看一下序列容器都有哪些吧:
array
array(數組容器)起作用與數組并無差别,都是在記憶體上開辟一塊記憶體連續的記憶體區存儲固定大小的資料,資料不能增加也不能删除。
但是array有一個好處就是它可以做越界檢查,另外array提供了很好的正反向疊代器。這是普通數組不具備的。array在用at()方法通路元素時會做安全檢查,是以一般建議用at()通路:
vector
vector(向量容器)是一個長度可變的序列,它與array和數組的差別在:vector屬于變長的容器,即可以根據資料的插入和删除重新構造容器容量;但是array和數組屬于定長容器。vector與array一樣都可以用下标和at()通路,同樣at()也支援越界檢查。
vector可以利用emplace、erase、swap、push_back/pop_back配合疊代器來實作在任意位置插入和删除元素,但是用起來會跟麻煩,新手可能會有點難了解:
deque
deque(雙向隊列容器)是一個長度可變的、可以自動增長的序列。它的通路操作和vector很相似,但是内部的存儲方式和 vector 不同。它組織元素的方式導緻容器的大小總是和容量相等,同樣因為 deque 内部組織元素的方式不同,deque 的操作和 vector 相比要慢。
deque通常由一些獨立的區塊組成,第一個區塊朝某方向發展,最後一個區塊朝另一個方向發展。它允許較為快速地随機通路但它不像vector一樣把所有對象儲存在一個連續的記憶體塊,而是多個連續的記憶體塊。并且在一個映射結構中儲存對這些塊以及順序的跟蹤。
deque在日常開發中用的不多,因為他的功能都可以用vector和list代替,并且它的效率不高,它唯一的優勢是頭部插入效率較vector和list高。它最主要的作用還是作為棧和隊列的底層實作存在。
List
List它的底層是雙向連結清單實作的(雙向連結清單我之前的文章中已經有很詳細的講解了,大家感興趣的可以去看一下),在這個序列的任何地方都可以高效地增加或删除元素。通路容器中任意元素的速度要比前三種容器慢,這是因為 list 必須從第一個元素或最後一個元素開始通路,需要沿着連結清單移動,直到到達想要的元素,而上面講的幾種容器都是可以随機通路的,是以在通路效率上List是有不足的,但是List的有點在與他的實體記憶體不連續,在增删元素時不需要大量的移動後續的元素,是以他的增删效率是最高的。
如上所示,由于List存儲實體結構為不連續,是以在增删時隻需要操作對應節點的前後指針就可以了。但是他在通路元素時必須從頭或者從尾開始一直周遊過去。
forward_list
forward_list它的底層就是單連結清單,它跟List的差別就是節點沒有指向前一個節點的指針即before指針,是以他隻能從前往後通路不能從後往前。它跟List操作上的差別就是所有List從後往前的操作在forward_list上都是行不通的,比如在一個節點前面插入節點、反向疊代等。
但是它的操作效率是比List要高的,因為畢竟少一個節點少一步操作嘛,是以大家在後續開發中,如果不牽涉到從後往前的的需求,可以用forward_list。
我想很多寫其他進階語言的,像C#、python、java等,我想大家很大部分應該都隻知道List、array等用起來很爽,但底層是什麼樣子應該都不知道吧!大家都一起來多多了解底層世界吧。