容器總結——array、vector、deque


  1. Array  #include <array>

包覆一個尋常的 static C-style array。比尋常array安全,而且效率沒有變差。

Array 並不支持分配器。Array適用任何STL算法

 

特性:

有序集合、隨機訪問、內存分配在stack中,絕不會重新分配

    1. 初始化

Default構造函數並非建立空容器。不賦初值不明確,不是0

array聲明期間初始化是使用初值列的唯一途徑。(不能超出大小)不能用小括號

    1. Swap()

可以和一個類型相同的array(元素類型和大小都相同)置換。

不僅只置換內部pointer有線性複雜度。

Iteratorreference不會隨着元素的置換而改變所指容器,但指向不同元素

    1. 大小

可能是0 。但是front()back()返回值不明確。

    1. 建立/複製/銷燬

Array<elem,N>c / c(c2) / c=c2 / c(rv) / c=rv / c=inilist

    1. 非更易操作

      .empty() .size() .max_size() c1==c2(返回boolc1!=c2c1<c2 c1>c2 c1<=c2 c1>=c2

    2. 賦值

      C=c2                c=rv           c.fill(val)            c1.swap(c2)            swap(c1,c2)

      Swap()不保證常量複雜度,因爲不可能在內部交換pointer

    3. 元素訪問

      Range-based for、操作函數、迭代器。可以用get<>()訪問。

      [ ].at()(更安全)(返回reference)。c.front() c.back() 返回第一、最末元素。

      (對於空array,會不明確)

    4. 迭代器相關函數

Array提供隨機訪問迭代器、反向迭代器,可以對array用任何STL算法

    1. Tuple接口

      Array提供了tuple接口。可以用:

      tuple_size<>::value取得元素個數

      tuple_element<>::type取得元素類型

      Get<1>(a)取得元素

    2. C-style array處理

      C++ 不需要C-style arrayvectorarray提供了C-style array所有特性,更安全更方便的接口。

  1. Vector   #include<vector>

將元素至於dynamic array中進行管理。

 

特性:

有序集合、隨機訪問、試用任何STL算法

末端附加刪除效率高,中間則每次調用assignment操作符移動元素

    1. Vector容量和大小

      優異效率:分配出較其容納元素更多的內存。

      附加大小函數capacity(),返回實際能夠容納的元素亮,超過將重新分配內存:

  1. 一旦重新分配內存,所有referencepointeriterator都會失效

  2. 內存重新分配很耗時間

保留容量方法:

  1. V.reserve(80)  更好

  2. Std::vector<int >v(5)   耗時不如使用.reserve()

    1. 初始化(額外的)

      Vector<elem> c(n,elem)/c(n)(初始化爲0

    2. 非更易操作

      .capacity()  .reserve(num)

    3. 賦值

      c.assign(n,elm)  c.assign(beg,end)  c.assign(inilist) 

    4. 元素訪問

      Range-based for、操作函數、迭代器。

      [ ].at()(更安全)(返回reference)。c.front()      c.back() 返回第一、最末元素。

      (對於空array,會不明確)調用[ ]時必須確保索引有效。

    5. 迭代器相關函數

Array提供隨機訪問迭代器、反向迭代器,可以對array用任何STL算法

Vector迭代器持續有效,除非:1.在較小索引位置安插刪除元素2.內存重新分配

    1. 安插移除元素

      保證:1.迭代器必須指向一個合法位置2.區間的其實位置不能在位置結束之後

      以下安插、移除比較快:

1.在尾部2.容量足夠大3.安插多個元素時調用一次

提供反向迭代器P276

 安插和移除元素,作用點之後的referencepointeriterator都會失效。

安插和移除的成員函數:P277(可與算法結合刪除某值元素).erase()的危險

    1. C-style array處理

      不要將迭代器當做第一元素的地址來傳遞

    2. Class vector<bool>

      bool型元素的特化版本,消耗空間遠小於一般vector

  1. Deque   #include<deque>

將元素至於dynamic array中進行管理。

 

特性:

有序集合、隨機訪問、試用任何STL算法

    1. Dequevector相比:

  1. 兩端都能快速安插和刪除元素

  2. 訪問元素時多一個間接過程

  3. 迭代器需要在不同區塊跳轉,必須是smart pointer

  4. 內含更多元素

  5. 除了兩端安插刪除元素,其他都會使referencepointeriterator失效。

  6. 內存重分配由於vector,不必複製所有元素

  7. 會釋放不再使用的內存區塊

 

採用deque1.兩端安插移除2.無需指向容器內元素3.不再使用的元素必須釋放

 

    1. Deque各項操作只有兩點與vector不同:

  1. Deque不提供容量操作(capacity()reserve()

  2. 增加頭部元素操作:push_front()pop_front()

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