1. 程式人生 > >(一)STL體系結構基礎介紹

(一)STL體系結構基礎介紹

 

一、STL六大部件

  容器(Containers):存放元素,記憶體由分配器搞定

  分配器(Allocator):支援容器的記憶體分配

  演算法:操作容器元素的函式。與OO不同(面向物件將元素與函式放到一個類裡),GP(模板程式設計)將資料放入容器,操作方法放入演算法中。

  迭代器(Iterator): 演算法和容器之間的橋樑,通過迭代器,演算法才能去操作容器中的元素。迭代器就是泛化的指標。

  介面卡(Adapters):對其他元件進行轉換。

  仿函式(Functors):自定義類的相關操作(比如自定義類A,計算其兩個例項的相加、相減等,即操作符過載)。

二、一個例子使用六大部件

  通常allocator那部分不用寫。

        

三、容器遍歷

  前閉後開區間

  

  使用auto,for遍歷

  

  auto的其他用法

   

 

四、容器結構與分析

  1、順序容器

  Array:固定大小,連續空間存放

  Vector: 當容量不夠時,allocator在背後重新分配

  Deque: 雙端佇列

  List: 雙向連結串列

  ForwardList:單向連結串列

  

  2、關聯容器(包括Unordered_Containers)

  

  關聯容器的查詢很快

  Map/Set:一般用紅黑樹實現(左右高度平衡的二叉樹)

  MultiMap/MultiSet: key可重複的。

  Map是key-value,Set是key-key。

  無序容器:元素存放的位置是不固定的,由hash-table實現(目前最好的實現方式是seperate chaining)。

五、容器使用

  1、編碼習慣

     (1)為每個獨立的程式建立namesapce;

     (2)  在用到變數時才定義變數,但不縮排;

  2、vector

    (1)因為單向,只能通過push_back存放元素(從頭存放需要移動整個vector);

    (2)   當空間不足,重新分配記憶體時,記憶體兩倍增長;

    (3)可以通過front,back訪問首尾元素,data訪問首地址(vector, array, list);

  3、List

     標準庫有sort,各個容器也有自帶sort,排序儘量用自帶的sort。每次擴充一個結點,空間利用率高

 4、forwad_list

      (1)壓入元素用的是push_front(其他用的都是push_back);

    (2)只有front訪問首元素(back,size都不提供);查詢較慢。

   5、deque

   (1)記憶體分段連續(由buffer構成,每個buffer是連續的),當記憶體不夠時,重新分配一個buffer。 

   (2)沒有自帶的sort,只能使用全域性的sort

   

   6、stack、queue

    內部都是通過deque來實現,一個後進先出,一個先進先出(不提供iterator)。有人也稱之為容器的介面卡(Adapter)

      

  7、multiset/multimap

  (1)通過insert插入元素(會慢一點),有自帶的find進行查詢(很快)

  (2)multimap: c.insert(pair<int, string>(i, buf)),不能使用c[i]來進行插入(key可能重複)

  (3)查詢時(*item).first為key,second為value

 8、unordered_multiset/unordered_multimap

      雜湊表實現

 9、map

      可通過m[i]=c來插入,內部會形成pair<>(i, c)來進行插入