C 標準模板庫STL

2021-10-10 09:44:58 字數 2572 閱讀 2615

stl 是「standard template library」的縮寫,中文譯為「標準模板庫」。stl 是 c++ 標準庫的一部分,不用單獨安裝。

c++ 對模板(template)支援得很好,stl 就是借助模板把常用的資料結構及其演算法都實現了一遍,並且做到了資料結構和演算法的分離。例如,vector 的底層為順序表(陣列),list 的底層為雙向鍊錶,deque 的底層為迴圈佇列,set 的底層為紅黑樹,hash_set 的底層為雜湊表。

簡單的理解容器,它就是一些模板類的集合,但和普通模板類不同的是,容器中封裝的是組織資料的方法(也就是資料結構)。stl 提供有 3 類標準容器,分別是序列容器、排序容器和雜湊容器,其中後兩類容器有時也統稱為關聯容器。它們各自的含義如表 1 所示。

stl容器分為三大類

序列容器

vector deque list

關聯容器

set multiset map multimap

容器介面卡

stack queue priority_queue

所謂序列容器,即以線性排列(類似普通陣列的儲存方式)來儲存某一指定型別(例如 int、double 等)的資料,需要特殊說明的是,該類容器並不會自動對儲存的元素按照值的大小進行排序。

需要注意的是,序列容器只是一類容器的統稱,並不指具體的某個容器,序列容器大致包含以下幾類容器:

array(陣列容器):表示可以儲存 n 個 t 型別的元素,是 c++ 本身提供的一種容器。此類容器一旦建立,其長度就是固定不變的,這意味著不能增加或刪除元素,只能改變某個元素的值;

vector(向量容器):用來存放 t 型別的元素,是乙個長度可變的序列容器,即在儲存空間不足時,會自動申請更多的記憶體。使用此容器,在尾部增加或刪除元素的效率最高(時間複雜度為 o(1) 常數階),在其它位置插入或刪除元素效率較差(時間複雜度為 o(n) 線性階,其中 n 為容器中元素的個數);

deque(雙端佇列容器):和 vector 非常相似,區別在於使用該容器不僅尾部插入和刪除元素高效,在頭部插入或刪除元素也同樣高效,時間複雜度都是 o(1) 常數階,但是在容器中某一位置處插入或刪除元素,時間複雜度為 o(n) 線性階;

list(鍊錶容器):是乙個長度可變的、由 t 型別元素組成的序列,它以雙向鍊錶的形式組織元素,在這個序列的任何地方都可以高效地增加或刪除元素(時間複雜度都為常數階 o(1)),但訪問容器中任意元素的速度要比前三種容器慢,這是因為 list 必須從第乙個元素或最後乙個元素開始訪問,需要沿著鍊錶移動,直到到達想要的元素。

forward_list(正向鍊錶容器):和 list 容器非常類似,只不過它以單鏈表的形式組織元素,它內部的元素只能從第乙個元素開始訪問,是一模擬鍊錶容器快、更節省記憶體的容器。

容器結構圖

stl一共實現了兩種不同結構的關聯式容器:樹形結構和雜湊結構。

樹形結構的容器主要有四種:map、set、multimap、multiset。

它們的共同點:使用平衡搜尋樹(紅黑樹)座位其底層結構。

map容器介紹:

map是關聯容器,它按照特定的次序(按照key來比較)儲存由鍵值key和值value組合而成的元素。

在map中,鍵值key通常用於排序和惟一地標識元素,而值value中儲存與此鍵值key關聯的內容。鍵值

key和值value的型別可能不同,並且在map的內部,key與value通過成員型別value_type繫結在一起,

為其取別名稱為pair:

typedef pair value_type;

在內部,map中的元素總是按照鍵值key進行比較排序的。

map中通過鍵值訪問單個元素的速度通常比unordered_map容器慢,但map允許根據順序對元素進行

直接迭代(即對map中的元素進行迭代時,可以得到乙個有序的序列)。

map支援下標訪問符,即在中放入key,就可以找到與key對應的value。

map通常被實現為二叉搜尋樹(更準確的說:平衡二叉搜尋樹(紅黑樹))。

容器介面卡是乙個封裝了序列容器的類模板,它在一般序列容器的基礎上提供了一些不同的功能。之所以稱作介面卡類,是因為它可以通過適配容器現有的介面來提供不同的功能。

3 種容器介面卡,分別是 stack、queue、priority_queue:

stack:是乙個封裝了 deque 容器的介面卡類模板,預設實現的是乙個**先出(last-in-first-out,lifo)的壓入棧。stack 模板定義在標頭檔案 stack 中。

queue:是乙個封裝了 deque 容器的介面卡類模板,預設實現的是乙個先入先出(first-in-first-out,lifo)的佇列。可以為它指定乙個符合確定條件的基礎容器。queue 模板定義在標頭檔案 queue 中。

priority_queue:是乙個封裝了 vector 容器的介面卡類模板,預設實現的是乙個會對元素排序,從而保證最大元素總在佇列最前面的佇列。priority_queue 模板定義在標頭檔案 queue 中。

C 標準模板庫STL

stl是標準c 庫的一部分。stl模板類為c 提供了完善的資料結構和演算法。stl的特點 型別引數化 即stl的 中可處理任意自定義型別的物件。泛型程式設計 generic programming 它以模板為基礎,弱化了 實體型別的差異,簡化了程式設計時問題抽象的模型,提供了更好的 封裝性和彈性。s...

C 標準模板庫STL

stl 標準模板庫 包括容器,演算法,迭代器 容器用來儲存資料,比如vector,list,堆疊等,string也算 一共有八個 演算法就是對容器進行操作,比如增刪改查資料 迭代器用來遍歷容器itreator 用指標的方式來遍歷容器的資料 注 平時使用的時候大部分時候我們都用上了,但是面試的時候不能...

c (標準模板庫STL)

stl是一種泛型程式設計 generic programming 容器主要有以下分類 例如 容器的成員函式begin 返回指向容器中第乙個元素的迭代器 end 返回指向容器中最後乙個元素後繼位置的迭代器。下面通過stl中提供的乙個泛型函式find 來說明迭代器與泛型演算法的關係 首先看下stl對於f...