是不是有涼住了?C++ STL庫介紹

1. STL庫中的容器介紹

(鏈接寫的非常好) https://www.cnblogs.com/linuxAndMcu/p/10254542.html

STL提供了七種容器類型:
向量(vector)、雙端隊列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)

前三種(向量,雙端隊列,列表)是序列式容器,裏面的數據按照插入順序排序(換句話說,是無序的)

後四種(集合和映射)是關聯式容器,元素位置取決於特定的排序準則以及元素值,和插入次序無關。如果你將六個元素置入這樣的羣集中,它們的位置取決於元素值,和插入次序無關。STL提供了四個序列式容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。

1.1 序列式容器

  1. vector
    vector是由動態數組實現的,它的特徵是相當於可分配拓展的數組(動態數組),它的隨機訪問快,在中間插入和刪除慢,但在末端插入和刪除快。

  2. list
    list是由雙向鏈表(doubly linked list)實現而成,元素也存放在堆中,每個元素都是放在一塊內存中,他的內存空間可以是不連續的,通過指針來進行數據的訪問,這個特點使得它的隨機存取變得非常沒有效率,因此它沒有提供[]操作符的重載。但是由於鏈表的特點,它可以很有效率的支持任意地方的插入和刪除操作。

  3. deque
    deque也是由動態數組實現的,是list和vector的折中方案。兼有list的優點,也有vector隨機線性訪問效率高的優點。

相同點:三者都能實現resize()來重新調整容器的大小。
不同點:

  • vector能實現隨機存取,即[]操作,而list不能,deque是二者的結合體,也能夠實現[]操作,但效率沒有vector高。
  • vector適合在文件的尾部實現插入與刪除操作,在頭部或中部時效率非常低下。而list可以在容器的任何位置實現插入與刪除操作。

1.2 關聯式容器

關聯式容器依據特定的排序準則,自動爲其元素排序。排序準則以函數形式呈現,用來比較元素值(value)或元素鍵(key)。缺省情況下以operator<進行 比較,不過你也可以提供自己的比較函數,定義出不同的排序準則。

通常關聯式容器由二叉樹(binary tree)實現。在二叉樹中,每個元素(節 點)都有一個父節點和兩個子節點;左子樹的所有元素都比自己小,右子樹的所有元素都比自己大。關聯式容器的差別主要在於元素的類型以及處理重複元素時的方式。

STL預先定義好的關聯式容器有:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。

  1. 集合
    set(集合)由紅黑樹實現,其內部元素依據其值自動排序,每個元素值只能出現一次,不允許重複。(紅黑樹是平衡二叉樹的一種)

  2. multiset
    Multiset和set相同,只不過它允許重複元素。

  3. map
    Map由紅黑樹實現,其元素都是“鍵值/實值”所形成的一個對組(key/value pairs)。每個元素有一個鍵,是排序準則的基礎。每一個鍵只能出現一次,不允許重複。

  4. multimap
    multimap和map相同,但允許重複元素

1.3 容器配接器

除了以上七個基本容器類別,爲滿足特殊需求,STL還提供了一些特別的(並且預先定義好的)容器配接器,根據基本容器類別實現而成。包括:

  1. stack
    stack 容器對元素採取LIFO(後進先出)的管理策略。

  2. queue
    queue 容器對元素採取FIFO(先進先出)的管理策略。也就是說,它是個普通的緩衝區(buffer)。

  3. priority_queue
    priority_queue 容器中的元素可以擁有不同的優先權。所謂優先權,乃是基於程序員提供的排序準則(缺省使用operators)而定義。Priority queue的效果相當於這樣一個buffer: “下一元素永遠是queue中優先級最高的元素”。如果同時有多個元素具備最髙優先權,則其次序無明確定義。

1.4 各種容器的異同點比較

1.4.1 Vector與數組的異同點

數組是c++中類似vector的數據結構,它們都可以對一種類型進行儲存,既都是容器。雖說兩者有相似之處,但也有顯著的區別,c++ primer的作者說到,在實際的編程中,我們作爲程序員應該避免用到低級數組和指針,而更應該多用高級的vector和迭代器。在程序強調速度的情況下,我們程序員可以在類類型的內部使用數組和指針。下面我對vector和數組進行了總結。兩者的相同點如下:

  • 都是對同一種類型的數據進行儲存。
  • 都可以用下標操作進行處理。
  • 都可以用迭代器進行操作(在c++中每個容器都配有各自的迭代器,數組也是種容器)

兩者的區別如下:

  • vector可以用size獲取vector的長度,而數組不可以。
  • vector長度不固定,可以隨時增加,而數組長度固定,在定義之後就不可以更改。
  • vector可以在末尾增加元素(用push_back),而數組不能增加在長度以外的長度。
  • 可以確定長度,節約空間,不能確定長度,必須在定義時定義一個很大的空間留給數組,造成內存的浪費。

1.4.2 C++ vector和list的區別

  • vector和數組類似,擁有一段連續的內存空間,而list是由雙向鏈表實現的,因此內存空間是不連續的。
  • vector支持高效的隨機存取,時間複雜度爲o(1),而list隨機存取效率很低,時間複雜度爲o(n),只能通過指針訪問。
  • vector只有在尾部插入和添加的效率高,而list在任何位置都能高效地進行插入和刪除。

2. STL相關面試題

2.1 STL中的sort算法用的是什麼排序算法?

https://www.cnblogs.com/easyeasier/p/10206565.html
答案: 結合快速排序-插入排序-堆排序 三種排序算法。

需要注意的幾個點:

  1. 並非所有容器都使用sort算法(需要考慮哪些STL容器需要用到sort算法?)
  2. 首先,關係型容器擁有自動排序功能,因爲底層採用RB-Tree,所以不需要用到sort算法。
  3. 其次,序列式容器中的stack、queue和priority-queue都有特定的出入口,不允許用戶對元素排序。
  4. 剩下的vector、deque,適用sort算法。
  • 劃重點: STL的sort算法,數據量大時採用QuickSort快排算法,分段歸併排序。一旦分段後的數據量小於某個門檻(16),爲避免QuickSort快排的遞歸調用帶來過大的額外負荷,就改用Insertion Sort插入排序。如果遞歸層次過深,還會改用HeapSort堆排序。

2.2 STL迭代器失效

尊重原創 https://www.cnblogs.com/linuxAndMcu/p/10254542.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章