-
Array #include <array>
包覆一個尋常的 static C-style array。比尋常array安全,而且效率沒有變差。
Array 並不支持分配器。Array適用任何STL算法
特性:
有序集合、隨機訪問、內存分配在stack中,絕不會重新分配
-
初始化
-
Default構造函數並非建立空容器。不賦初值不明確,不是0。
在array聲明期間初始化是使用初值列的唯一途徑。(不能超出大小)不能用小括號。
-
Swap()
-
可以和一個類型相同的array(元素類型和大小都相同)置換。
不僅只置換內部pointer,有線性複雜度。
Iterator和reference不會隨着元素的置換而改變所指容器,但指向不同元素。
-
大小
-
可能是0 。但是front()、back()返回值不明確。
-
建立/複製/銷燬
-
Array<elem,N>c / c(c2) / c=c2 / c(rv) / c=rv / c=inilist
-
非更易操作
.empty() .size() .max_size() c1==c2(返回bool)c1!=c2c1<c2 c1>c2 c1<=c2 c1>=c2
-
賦值
C=c2 c=rv c.fill(val) c1.swap(c2) swap(c1,c2)
Swap()並不保證常量複雜度,因爲不可能在內部交換pointer。
-
元素訪問
Range-based for、操作函數、迭代器。可以用get<>()訪問。
[ ]、.at()(更安全)(返回reference)。c.front() c.back() 返回第一、最末元素。
(對於空array,會不明確)
-
迭代器相關函數
-
Array提供隨機訪問迭代器、反向迭代器,可以對array用任何STL算法
-
Tuple接口
Array提供了tuple接口。可以用:
tuple_size<>::value取得元素個數
tuple_element<>::type取得元素類型
Get<1>(a)取得元素
-
當C-style array處理
C++ 不需要C-style array,vector和array提供了C-style array所有特性,更安全更方便的接口。
-
-
Vector #include<vector>
將元素至於dynamic array中進行管理。
特性:
有序集合、隨機訪問、試用任何STL算法
末端附加刪除效率高,中間則每次調用assignment操作符移動元素
-
Vector容量和大小
優異效率:分配出較其容納元素更多的內存。
附加大小函數capacity(),返回實際能夠容納的元素亮,超過將重新分配內存:
-
-
一旦重新分配內存,所有reference、pointer、iterator都會失效
-
內存重新分配很耗時間
保留容量方法:
-
V.reserve(80) 更好
-
Std::vector<int >v(5) 耗時不如使用.reserve()。
-
初始化(額外的)
Vector<elem> c(n,elem)/c(n)(初始化爲0)
-
非更易操作
.capacity() .reserve(num)
-
賦值
c.assign(n,elm) c.assign(beg,end) c.assign(inilist)
-
元素訪問
Range-based for、操作函數、迭代器。
[ ]、.at()(更安全)(返回reference)。c.front() c.back() 返回第一、最末元素。
(對於空array,會不明確)調用[ ]時必須確保索引有效。
-
迭代器相關函數
-
Array提供隨機訪問迭代器、反向迭代器,可以對array用任何STL算法
Vector迭代器持續有效,除非:1.在較小索引位置安插刪除元素2.內存重新分配
-
安插移除元素
保證:1.迭代器必須指向一個合法位置2.區間的其實位置不能在位置結束之後
以下安插、移除比較快:
-
1.在尾部2.容量足夠大3.安插多個元素時調用一次
提供反向迭代器P276
安插和移除元素,作用點之後的reference、pointer、iterator都會失效。
安插和移除的成員函數:P277(可與算法結合刪除某值元素).erase()的危險
-
當C-style array處理
不要將迭代器當做第一元素的地址來傳遞
-
Class vector<bool>
對bool型元素的特化版本,消耗空間遠小於一般vector
-
-
Deque #include<deque>
將元素至於dynamic array中進行管理。
特性:
有序集合、隨機訪問、試用任何STL算法
-
Deque與vector相比:
-
-
兩端都能快速安插和刪除元素
-
訪問元素時多一個間接過程
-
迭代器需要在不同區塊跳轉,必須是smart pointer
-
內含更多元素
-
除了兩端安插刪除元素,其他都會使reference、pointer、iterator失效。
-
內存重分配由於vector,不必複製所有元素
-
會釋放不再使用的內存區塊
採用deque:1.兩端安插移除2.無需指向容器內元素3.不再使用的元素必須釋放
-
Deque各項操作只有兩點與vector不同:
-
-
Deque不提供容量操作(capacity()、reserve())
-
增加頭部元素操作:push_front()和pop_front()