C++標準庫分析總結(一)

以前學習過標準庫,最近身邊有人問到相關話題,故在此作一個總結ios

1 標準庫介紹

  C++標準庫:C++ Standard Library
  C++標準模板庫:Standard Template Library(STL)c++

1.1 兩者關係及表現形式

  1. 標準庫是由編譯器提供的(好比咱們常見的VC,GCC...),STL屬於標準庫的一部分(佔比絕大部分),標準庫必定是包含(大於)STL的;
  2. 標準庫引用形式:
    •   都是以頭文件的形式提供不帶.h,好比:#include<vector>;
    •   新式c頭文件通常是:#include<cstdio>;
    •   命令空間:namespace std;

  引用方法:算法

1 #include <iostream>
2 #include <cstdio>  //snprintf()
3 #include <cstdlib> //RAND_MAX
4 #include <cstring> //strlen(), memcpy()
5 #include <string> 
6 using namespace std;
7 using std::cin;
8 using std::cout;
9 using std::string;

 1.2 STL六大部件

  以上的六大部件解釋以下:數組

  1. 容器:容器就是咱們存放數據的地方,至關於數據倉庫,實現方式是類模板;
  2. 分配器:管理容器背後的內存使用,實現方式是類模板;
  3. 算法:常見的好比排序、查找等,實現方式是函數模板;
  4. 迭代器:算法操做容器的橋樑,是一種泛化的指針,實現方式是類模板;
  5. 仿函數:或者叫Function Object,它是一個類對象,其次它重載了()操做符,使用在自定義類對象時,好比咱們對石頭進行排序,在算法操做時就能夠寫一些仿函數供算法正確使用,實現方式時類模板;
  6. 適配器:相對於迭代器、仿函數、容器的數據轉換,實現方式是類模板。

1.3 STL的簡單使用

 

1.4 事間複雜度

  要討論時間複雜度,其中n必須創建在足夠大的工業數據基礎上函數

1.5 STL中的區間表示法

   STL採用前閉後開區間表示數據的範圍,全部的數據都是經過begin()和end()兩個函數表示數據的範圍,begin表示數據的頭,end表示數據尾的下一個元素,也就是說,對end進行解引用操做獲得的指針它是不肯定的東西,也可能形成程序宕機或者其餘不是你內心所想的東西。學習

2 容器分類

  容器分爲序列式容器和關聯式容器(分爲有序和無序),紅色部分是c++2.0引入的spa

序列式容器(Sequence Container):元素都是有序的,裏面的空間多是連續的,也多是由指針一個個串起來的;指針

關聯式容器(Associative Container):元素是由key和value組成的,固然用key能很快找value,適用於查找操做code

2.1 序列式容器(Sequence Container)

2.1.1 Array

  對比於c語言的數組,標準庫進行封裝,初始化的時候就要肯定大小,不能擴展(注意在棧上有大小限制,不一樣的機器內存限制不同);對象

2.1.2 Vector

  一種能夠動態擴充的數組,只能在容器的末端進行擴充,當容量不足時會自動擴充,擴充規則爲當前空間的2倍,內存由Vector背後的分配器進行,使用者不用關心內存分配問題;

2.1.3 Deque

  雙端隊列,容器兩端都可進行數據擴充;

2.1.4 List

  雙向環狀鏈表,內存佔用比Forward_List多;

2.1.5 Forward_List

  單向鏈表,只能從尾部擴充。

2.2 關聯式容器(Associative Container)-- 有序

  元素key是有序

2.2.1 Set/MultSet

  目前各大廠商編譯器都是由紅黑樹(RBtree)實現,保證每一個子樹根節點鍵值大於左子樹全部節點的鍵值,小於右子樹全部節點的鍵值,左右是高度平衡的防止某一個分支比較長,每一個元素由key和value組成,set中key和value是同一個值,key和value是不分的,元素不可重複,當重複放入時容器會反彈回來;

  MultSet表示元素能夠重複。

2.2.2 Map/Multimap

  目前各大廠商編譯器也都是由紅黑樹實現,區別於set,每一個元素分爲key和value,一樣元素不可重複,當重複放入時容器會反彈回來;

  Multimap表示元素可重複,也就是key-value可重複。

2.3 無序容器(Unordered Container)-- 無序

  元素的key是無序的;

  Unordered set和Unordered  map底層是由哈希表(Hashtable)實現,用哈希表必然存在元素碰撞問題,因此各大編譯器都採用Separate Chaining哈希表。

相關文章
相關標籤/搜索