目录
4.创建一个包含从 start 到 end 之间的所有元素的 vector
特点
其操作方式与C++中的数组array类似,但两者的区别在于空间运用的灵活性
1.array是静态空间,一旦配置就不能再改变大小
2.vector是动态空间,随着vector容器中的元素不断加入,其内部机制会自行扩充空间以容纳新元素
vector的数据结构
vector采用线性连续空间,其中包含三个迭代器start、finish、end_of_storage
迭代器start指向配置的连续空间中的起始位置
迭代器finish指向配置的连续空间中已使用范围的末尾位置的下一个位置
迭代器end_of_storage指向整块连续空间的尾端
size标识已使用空间的大小,capacity标识整个vector连续空间的大小
例子
vector的构造函数
1.不带参数的构造函数
vector<int> vec;
cout<<"capacity"<<vec.capacity();
只生成一个vector实例,输出的大小为0
2.默认的拷贝构造函数
创建一个给定 vector的复本vector
vector<int> vec1(vec);
3.创建一个有n 个对象的 vector
如果value值给定,所有的对象都被赋上value值,否则默认全部初始化为0值
vector<int> vec1(10);
vector<int> vec2(10,2);
auto ite1 = vec1.begin();
auto ite2 = vec2.begin();
while(ite1 != vec1.end())
{
cout<<*ite1<<" ";
++ite1;
}
cout<<endl;
while(ite2 != vec2.end())
{
cout<<*ite2<<" ";
++ite2;
}
输出
4.创建一个包含从 start 到 end 之间的所有元素的 vector
vector<int> vec1(10,2);
vector<int> vec(vec1.begin(),vec1.end());
auto ite = vec.begin();
while(ite != vec.end())
{
cout<<*ite<<" ";
++ite;
}
输出
5.利用数组创建vector
int arr[] = {1,2,3,4,5};
vector<int> vec(arr,arr+5);
auto ite = vec.begin();
while(ite != vec.end())
{
cout<<*ite<<" ";
++ite;
}
输出
vector操作的内存管理
push_back
当利用push_back()将新元素插入vector尾端中时,首先检查vector容器中是否有备用空间
- 若存在备用空间,则直接在备用空间中添加元素,调整迭代器finish
- 若不存在备用空间,则vector进行空间扩容(不同编译器扩容大小不同,VS下是1.5倍,GCC是2倍)
扩容操作并非在原空间之后续接新的地址空间,而是同时包含新地址的分配、旧地址到新地址的元素移动、以及旧地址空间的释放
所以程序运行中一但出现空间重新配置,则指向原vector的迭代器失效
扩容相关问题参考:
https://www.cnblogs.com/-citywall123/p/12846941.html
https://blog.csdn.net/yangshiziping/article/details/52550291
pop_back
只将vector中尾端元素清空,并不会调整vector的空间大小
erase
erase的实现版本有多种,以清除局部区间的操作为例
清空两个迭代器指针(first,last)指向的局部区间内的vector元素
1.首先将last到finish之间的元素全部复制到first开始往后的位置
2.然后将复制的最后位置到finish之间的元素全部清空
需注意此时原迭代器已失效