1. vector的介绍
vector:vector的底层实际上就是一个数组(也称为顺序表),数据是连续存储在数组中的,因此vector是可以使用下标来进行访问的,但是它的大小并不是像数组一样是固定的,而是可以动态调整的。
1.1 vector的成员变量
template<class T>
class vector
{
public:
typedef T* iterator;
private:
iterator _start=nullptr;
iterator _end = nullptr;
iterator _finish = nullptr;
}
成员变量是三个指针,分别指向数组中的第一个元素,指向数组的最后一个元素的后一个元素,指向数组中有效的最后元素的后一个元素。
vector的演示图
2. vector的使用
下面只是对常用的一个成员函数进行介绍,如需详细请自行访问vector的官方文档。
构造函数:
vector() //无参构造
vector (const vector& x) //拷贝构造
vector (InputIterator first, InputIterator last)//迭代器区间构造
iterator的使用
begin()//获取第一个数据位置的iterator/const_iterator
end()//获取最后一个数据的下一个位置的iterator/const_iterator
rbegin()//获取最后一个数据位置的reverse_iterator
rend//获取第一个数据前一个位置的reverse_iterator
容量空间
size()//获取数据个数
capacity()//获取容量大小
empty()//判断数据量是否为空
resize()//改变vector中size的大小
recapacity()//改变vector中的capacity,但是一般只有当需要改变的量大于vector中的capacity,capacity才会改变,小于vector中的capacity一般是不会改变的。
增删改查
push_back()//尾插
pop_back()//尾删
find()//查找
erase()//删除指定位置的元素,还可以删除一个区间中的所有元素
insert()//在指定位置之前插入元素
operator//向数组一样访问元素
注:上面函数的功能不全,只是列举了一些常用的功能,还有很多少用的功能,这篇文章并没有过多介绍
3. vector的迭代器失效
迭代器:迭代器其实是一种封装的思想,其目的是为了,在不同的容器中,可以使用迭代器进行统一的访问和操作
vector的迭代器:vector的迭代器的底层实际上就是一个指针,迭代器失效也就是当指针所指向的内容被释放或者已经被销毁,这样很容易造成程序的崩溃。
vector迭代器失效的原因
- 操作引起底层的空间改变。
#include <iostream>
using namespace std;
#include <vector>
int main()
{
vector<int> v{1,2,3,4,5,6};
auto it = v.begin();
recapacity(100);
//在进行扩容时,realloc函数不能在原空间后面进行扩容,需要另外开辟空间,it原来所指向的空间内容被释放,这是it迭代器就失效了
return 0;
}
- 指定位置元素的删除操作(erase函数)。当erase函数对vector的元素进行删除时,传入的迭代器指向需要删除元素的位置,删除该元素,后面的元素占据该位置。这时该迭代器就变成指向后面元素,这种情况也认为是迭代器失效。(在vs中是直接运行崩溃,但是在Linux中是可以的,能不能用该迭代器进行数据访问还是要看具体的编译器)
4. 模拟实现vector容器
由于模拟的代码篇幅过长,请大家直接访问我的giteevector的模拟实现。