STL -容器 <vector> 相关API及原理
Vector(序列容器)
Vector维护一个线性空间,单向开口的连续内存空间(开口在尾部),所谓动态增长并不是在原有空间上接续新空间(因为无法保证
原有空间之后尚有可配置的空间),而是一块更大的内存空间 然后将原数据拷贝到新空间中,并释放原空间。因此,对vector的任
何操作,一旦引起空间的重新配置,指向原vector的所有迭代器都会失效
迭代器
Vector迭代器是随机访问的迭代器,支持跳跃访问
Insert/erase/ (迭代器)
逆序迭代器 reverse_iterator .
例如:for(vector
构造函数
vector<T> v 默认构造函数
vectoor(v.begin(),v.end()) //将v.begin()到end()区间中的元素拷贝给本身
vector(n,T) 构造函数将n个T拷贝给本身
vector(const vector &vec) 拷贝构造函数
常用赋值操作
assign(beg,end); 将(beg,end)区间的数据拷贝赋值给本身
assign(n,T) 将n个T拷贝赋值给本身
vector &operator=(const vector &vec) 重载等号
swap(vec)将vec与本身的元素互换
大小操作
int size() 返回容器中元素的个数
bool empty() 判断容器是否为空
resize(int num) 重新指定容器的长度为num,若容器变长则以默认值填充新位,如果变短就删除尾部
resize(int num,T)
int capacity() 容器的容量
reserve(int len) 容器预留len个元素长度,预留位置不初始化,元素不可访问
关于resize和reserve的区别
resize()
调整容器的长度大小,使其能容纳n个元素。
如果n小于容器的当前的size,则删除多出来的元素。
否则,添加采用值初始化的元素。
resize(n,t)
多一个参数t,将所有新添加的元素初始化为t。
reserver()的用法只有一种
reserve(n)
预分配n个元素的存储空间。
了解这两个函数的区别,首先要搞清楚容器的capacity(容量)与size(长度)的区别。
size指容器当前拥有的元素个数;
而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。
也可以说是预分配存储空间的大小。
resize()函数和容器的size息息相关。调用resize(n)后,容器的size即为n。
至于是否影响capacity,取决于调整后的容器的size是否大于capacity。
reserve()函数和容器的capacity息息相关。
调用reserve(n)后,若容器的capacity<n,则重新分配内存空间,从而使得capacity等于n。
如果capacity>=n呢?capacity无变化。
从两个函数的用途可以发现,容器调用resize()函数后,所有的空间都已经初始化了,所以可以直接访问。
而reserve()函数预分配出的空间没有被初始化,所以不可访问。reserve主要是用来调整容器内部分配存储空间的策略