vector的内存分配
【理解】
vector,简单地讲就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时会自动申请另一片更大的空间,然后把原有数据拷贝过去,接着释放原来的那片空间。
【使用】
实际上vector是一个模板类,放在vector头文件中,使用前包含头文件#include < vector>,使用时声明:vector < classname> var_name; 还有一定要加上using namespace std;
【初始化】
vector< int > v; //仅声明
vector< int > v1(10, 1); //初始化为10个值为1的v1
vector< int > v2(v1); //用v1初始化v2
vector< int > v3(10); //初始化为10个默认值0的v3
vector< int > v4(v1.begin(), v1.end()); //将v1第0个到最后一个作为v4的初始值。
int n[]={1,2,3,4,5};
vector< int> v5(n, n+5); //将数组n的前5个元素作为v5的初始值
vector< int> v6(&n[0], &n[4]); // 同上
【深入】
vector对象存放在内存的栈上面,而对象中的数据,也就是这些连续的空间分配是放在内存的堆上,以连续的空间给出。最开始会以满足元素个数为准(比如存放1个int变量,那么vector的容量最初为1),而如果增加元素数量,vector的容量则会以当前容量的一定倍数增长,如当前容量和元素都是4,当再增加一个元素时容量将会变为4*n,不同的操作系统和编译器 n取值也会不同,但是大概为n=1.5或2,也就是说每当容量满员后会增加一半到一倍的容量。
增长后的区域会重新分配地址,原来的内容复制到当前空间上,原始空间被释放掉。所以vector的一个额外的要求就是存储的元素需要有拷贝构造函数。
vector的操作优劣
【和数组相比】
优点:
安全,不会不小心越界
可以利用标准库的很多功能,包括现成的成员函数和一些泛化算法
【和list等stl函数相比】
优点:因为vector的存储是以连续区域形式存储的,所以对随机查找操作速度很快。
缺点:
实现插入与删除操作效率低,
只能在尾部插入与删除,在头部插入与删除消耗时间规模与容器大小成正比。
当动态添加的数据超过默认内存大小时,要进行整体的重新分配,拷贝与释放。
vector的操作函数
1. push_back 在数组的最后添加一个元素
2. pop_back 去掉数组的最后一个元素
3. at 获得某一位置的数组元素
4. begin 得到数组第一个元素的迭代器
5. end 得到数组的最后一个元素之后的迭代器
6. front 得到数组第一个元素的引用
7. back 得到最后一个元素的引用
8. max_size 得到vector
9. capacity 当前vector分配的大小
10. size 当前元素占用的空间大小
11. resize 改变当前元素占用的大小,如果它比当前使用的大,者填充默认值
12. reserve 改变当前vecotr所分配空间的大小
13. erase 删除指针指向的数据项
14. clear 清空当前的vector, 但存储空间不变
15. rbegin 指向反向迭代器的开始,即vector正向迭代器的end
16. rend 指向反向迭代器的末尾,即vector的begin
17. empty 判断vector是否为空
18. swap 与另一个vector交换数据,或用来释放空间
19. insert 在某一位置插入一个或一组元素
20. 下标操作符 同at()一样
21. assign 将n个元素拷贝赋值给当前vector