-
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()