C++ 常見容器

迭代器。

基本介紹(來源於網絡):迭代器是一種抽象的概念。可以遍歷容器內的 部分/所有 元素。每一個迭代器中包含着元素的地址。  它能夠將 抽象容器 和 泛型算法 結合起來。
 
大體原理:
  1) 迭代器對象 包含 容器內元素的地址。
  2)經過設計,將元素操做統一。
我的理解:
  1)迭代器的概念,有效整合不一樣容器和泛型算法。它提供了一個接口,用來操做容器內元素。
  2)通俗理解:他是STL庫的信息接口。
  3)它要求全部操做應該有相同接口。
  4)容器須要提供本身的迭代器,使用泛型算法儘可能使用迭代器。
一些細節:
  1)改變容器內元素的儲存地址的操做,可能致使原有迭代器失效。間接說明,迭代器的本質是指針。
  2)尾後迭代器一般表示結束。
  3)迭代器不能使用 取地址符號’&‘ 來獲取。
 
五類迭代器:一個真正的迭代器能夠包含如下數種類型。
  1)輸入/出迭代器:讀取序列中的元素。須要支持如下幾點:
    1,[ == ] [ != ],[ ++ ],[ * ],[ -> ]
  2)前向迭代器:單向移動。
  3)雙向迭代器:雙向移動
  4)隨機訪問迭代器:支持使用下標操做。

順序容器。

通用概念。算法

  順序容器基本理解:按照順序儲存元素,並提供 元素具體操做(迭代器或其餘) 和 順序訪問元素 的能力。數組

  我的理解:安全

    1)順序:按照添加的前後次序排序。但,先進優先,仍是後進優先取決於具體容器。網絡

  我的應用:數據結構

    1)在可使用容器時,儘可能使用容器。由於你沒法保證本身的算法優於整個開發組。函數

    2)選擇容器的基本原則(from C+ primer):spa

      1,在不知道如何選擇時,使用vector。設計

      2,單個元素需求內存很小,內存緊缺時,不要使用list/forward_list。指針

      3,已知添加操做時,儘可能使用符合 原設計思想 的容器。例如:頻繁的隨機插入/刪除,使用list/forward_list,而儘可能不使用vector,deque。對象

      4,觸類旁通:混合添加操做時,選擇最頻繁的添加操做,做爲選擇容器的標準。例如:100次後置添加 + 一次隨機操做時,選擇vector,deque。反之:list/forward_list。

      5,觸類旁通:添加操做在某些階段存在統一,則能夠進行容器替換。例如:輸入元素使用 list。輸入結束後,使用vector儲存(copy list),再進行讀取操做。

    3)儘可能使用迭代器來操做容器——雖然有些容器支持下標。

vector容器:

  一些細節:

    1)使用連續內存保存元素。

    2)能夠下標訪問元素(速度快)。但是看成動態數組使用。

    3)中間添加/刪除元素耗時。因,須要從新調整內存。同時會致使迭代器失效(大機率)。

    4)添加新元素時(push_back),也可能從新分配內存。致使迭代器失效(中機率)。

    5)容器存在增加方式:超出時,按照必定量增長內存,以保證添加數個元素後,才須要再次分配內存。量值可經過函數設定(不建議)。

deque容器:

  一些細節:

    1)使用連續內存保存元素。

    2)不肯定是否可使用下標訪問。

list容器:雙向鏈表。

  一些細節:

    1)使用鏈表的思想。

    2)額外內存開銷相對較大。

    3)不支持下標。

forward_list容器:

  一些細節:

    1)和list容器相似。

    2)主要特徵:單向鏈表。

array容器:

  一些細節:

    1)對數組的封裝。增強安全性。

    2)有數組的特性。

string容器:

  一些細節:

    1)使用連續內存保存元素。

    2)用來保存字符串。

適配器:

  概念:一個適配器是一種機制。經過適配器,可使容器從行爲上模仿其餘數據結構。

  順序容器可用適配器:stack, queue, priority_queue。

  我的理解:用來模擬一些通用的數據結構。如上:堆棧,隊列。

  疑惑:爲什麼不直接作成容器?

無序容器。

基本常識:

  1)主要爲:map 和 set。衍生型:multi和unorder.例如:multimap, unorder_multimap.

  2)使用pair做爲單位元素。

    1,key-value組成一個pair.

    2,first成員:key。second成員:value。

    3,key爲const類型不可改變。

  3)關聯容器的構成:key-pair.

基本要點:

  1)一般不對關聯容器使用 泛型算法。

  2)有序關聯容器,有 嚴格弱序 的要求。默認使用 [<=]。固然,也可使用謂詞或lambda表達式來自定義。

相關文章
相關標籤/搜索