STL容器選擇

2021-09-26 19:34:47 字數 2237 閱讀 9034

個人筆記

1、預設狀態下應該選擇vector,因為vector內部結構最簡單,並允許隨機訪問,所以資料的訪問十分方便,資料的處理也快。

2、如果經常要在頭部和尾部安插和移動元素,應該採用deque,如果希望元素被移除時,容器能夠自動縮減記憶體,也應該使用deque。

3、如果經常在容器的中段執行元素的安插、移除和移動,可以使用list,list提供特殊的成員函式,可以在常數時間內從a容器將元素轉移到b容器,但是list不支援隨機訪問,所以如果只知道list的頭部元素,需要訪問list的中部元素,效能會大打折扣。

4、如果經常需要根據某個準則來搜尋某個元素,那麼應該使用「以該排序準則對元素進行排序的」set或者multiset。

5、如果需要key/value pair,應當使用map或者multimap。如果需要關聯陣列,也可以使用map或者multimap。

序列式容器

所謂序列式容器,其中的元素都可序,但未必有序。

vector

vector與標準庫的array陣列相似,空間由自己動態分配,採用線性的連續空間

優點:由於vector是連續性的所有讀取效率高。

缺點:在插入資料方面效率不高,需要頻繁插入資料方面不建議使用

list

list乙個迴圈雙向鍊錶,所以只需要乙個指標,可以遍歷整個鍊錶。

優點:在插入元素時 效率高,特別是在需要對元素做一系列增刪改查操作時,內部提供了許多對元素操作的介面。

缺點:deque

deque 顧名思義是雙端佇列,儲存一系列的指標,指標指向的儲存區(緩衝區)才是deque的主體。

優點:可以在頭尾兩端做元素插入和刪除

缺點:插入的時候需要檢索插入點前的元素個數和插入點後的元素在元素少的地方插入,插入效率不高

關聯式容器

set

set所有元素都會根據元素的鍵值進行自動排序,元素的鍵值就是實值,底層機制採用紅黑樹 --rb-tree

優點:用於自動排序好

缺點:不允許有相同的鍵值,不能根據set的迭代器改變set的元素值

multiset的特性以及用法 和set完全一樣,唯一區別是multiset允許鍵值重複。因為它的插入操作採用的是rb-tree的insert_equal,而不是insert_unique。

map

map的特性是,所有的元素會根據元素的鍵值自動排序,所有元素以pail形式呈現,pail第一元素為鍵值,第二元素為實值。底層也採用紅黑數rb-tree實現

優點:適用特定環境下需關聯鍵值與實值得情況。

缺點:map不允許元素擁有相同的鍵值,不可改變map的鍵值,但可以修正元素的實值

multimap的特性以及用法 和map完全一樣,唯一區別是multimap允許鍵值重複。因為它的插入操作採用的是rb-tree的insert_equal,而不是insert_unique。

priority_queue

hashtable

hash table實現是通過hash function實現的。為了避免hash function帶來的「碰撞」問題,常用的是二次線性探測和開鏈法

優點:適用特定環境下需關聯鍵值與實值得情況。

缺點:hash function 會帶來「碰撞」問題。

hash_set

hash_set是以hashtable為底層機制,rb-tree有自動排序功能而hash table沒有,因此set的元素有自動排序功能,而hash_set沒有。這是它倆的唯一區別,其他操作是一樣的。

hash_multiset與multiset的操作基本一樣,唯一區別也是無自動排序功能。

hash_map

hash_map底層機制也是hash table,與map的區別也是五排序功能。hash_multimap,亦如此。

配接器*

stack*

stack是一種先進後出的資料結構,只允許在一端插入元素和移出或取得最頂端元素。

以底層容器作為元素,list和deque ,以deque為預設容器,沒有迭代器

queue

queue是一種「先進先出」的資料結構。只允許底端加入元素,頂端取出元素,不允許遍歷。

以list,deque容器為底層結構。也是沒有迭代器

如何選擇STL容器?

大家知道,c 的stl標準庫很好用,裡面的vector,list,deque,stack,slist,set,map,都很好用。但是,在實際程式設計過程中,如何根據自己的專案需求選擇裡面的一種容器呢?最好的辦法就是了解其中的原理,然後做選擇。補充,如果專案中不考慮效率,就不用考慮那麼多了 畢竟stl...

STL容器的選擇

標準stl序列容器 vector string deque和list。標準stl關聯容器 set multiset map和multimap。非標準序列容器slist和rope。slist是乙個單向鍊錶,rope本質上是乙個重型字串。繩子 rope 是重型的 線 string 明白了嗎?你可以找到乙...

STL中序列容器的選擇

在stl中基本容器有 vector list deque set map set 和map都是無序的儲存元素,只能通過它提供的介面對裡面的元素進行訪問 set 集合,用來判斷某乙個元素是不是在乙個組裡面,使用的比較少 map 對映,相當於字典,把乙個值對映成另乙個值,如果想建立字典的話使用它好了 底...