1.vector的使用
1.1vector的定义
构造函数声明 | 接口说明 |
vector() | 无参构造 |
vector(size_type n,const type_val & val=type_type()) | 构造并初始化val |
vector(const vector& x)(重点) | 拷贝构造 |
vector(inputlterator begin,inputlterator end) | 使用迭代器进行初始化构造 |
1.2vector iterator 的使用
iterator的使用 | 接口说明 |
begin | 获取第一个位置 |
end | 获取最后一个位置的下一个 |
rbegin | 获取最后一个位置 |
rend | 获取第一个位置的前一个 |
1.3vector的空间增长问题
容量空间 | 接口说明 |
size | 获取数据的个数 |
capacity | 获取空间的大小 |
empty | 判断是否为空 |
resize | 改变vector的size |
reserve | 改变vector的capacity |
当我们不去控制vector对象的空间时,一直想其中添加数据那么vector是怎么增长的呢??
看下面代码
using namespace std;
#include<iostream>
#include<vector>
int main()
{
vector<int> v1;
int size = 0;
for (int i = 0; i < 100; i++)
{
v1.push_back(i);
size++;
if (size==v1.capacity())
{
cout << v1.capacity() << endl;
}
}
}
在vs的环境下我们可以看出vector类型的对象,空间增长是按1.5倍来增长的
那我们再来看在linux环境下vector是如何增长的呢
我们可以看到,在linux的环境下vector对象增加个数是按2倍进行增长的
1.4vector的增删查改问题
vector的增删查改 | 接口说明 |
push_back | 尾插 |
pop_back | 尾删 |
find | 查找 |
insert | 在position前插入val |
erase | 删除position的数据 |
swap | 交换两个vector的数据空间 |
operator[] | 想数组一样访问 |
1.5vector的迭代器失效问题
迭代器的作用就是让算法不用关心底层数据结构,其底层就是一个指针,或者是对指针进行封装,比如:vector的迭代器就是原生指针T*,因此迭代器失效就是迭代器对应的底层指针指向的那块空间被销毁了,使用了被释放的空间,因此程序会报错。
1.5.1扩容引起的迭代器失效
会引起空间的改变一般都有可能会引起迭代器失效,比如resize,resign,insert,push_back,reserve。
需要扩容时,编译器可能会新开辟一段空间,那么原来的那段空间就失效了,被释放了,但是那个迭代器依然还指向那段空间,所以在访问那段空间时编译器就会崩溃。比如
using namespace std;
#include<iostream>
#include<vector>
int main()
{
vector<int> v1 = { 1,5,7,4,3,2 };
auto it = (v1.begin()+3);
v1.assign(100, 9);
cout << *it;
}
1.5.2删除数据引起的迭代器失效
当我们删除一个数据时,编译器会将这个被删除的数据位置后面的数据往前面移动一格
那么迭代器就有可能指向末尾的数据。那么访问时会报错,就算迭代器没有指向末尾的数据,在vs的环境下,会进行强制检查,意思就是当删除这个数据时,再次访问这个位置或是访问后面的位置时,即使没有指向末尾的数据,编译器仍然会报错
虽然不能访问后面的数据但前面的数据依然可以访问