vector是可以储存任意类型的动态顺序表
构造与销毁
vector构造时指定容器中的数据类型
构造的方式
- 空构造
- n个值位value的构造
- 区间构造
- 拷贝构造
//空构造
vector<int> v1;
//构造十个5
vector<int> v2(10, 5);
//范围构造
vector<int> v3{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//拷贝构造
vector<int> v4(v2);
除了容器中的元素外,容器中还包含
- size:容器中数据的个数
- capacity:容器的总容量
容量操作
函数 | 功能 |
---|---|
size() | 获取数据个数 |
capacity() | 获取容量大小 |
empty() | 判断当前是否为空 |
resize(n,data) | 改变size |
reserve(n,data) | 改变capacity |
元素访问
函数 | 功能 |
---|---|
operator[] | 下标访问 |
font() | 返回容器中首个元素 |
back() | 返回容器末尾元素 |
元素修改操作
函数 | 功能 |
---|---|
push_back() | 尾部插入一个元素 |
pop_back() | 删除尾部一个元素 |
insert(pos,val) | 在pos位置前插入值为val的元素 |
erase(pos) | 删除pos位置的元素 |
swap() | 交换两个vector中的空间 |
vector<int> v{0,1,2,3,5};
//尾插,尾删
v.push_back(6);
v.pop_back();
//找到值为5的位置,并在位置前插入4
vector<int>::iterator pos = find(v.begin(), v.end(), 5);
v.insert(pos, 4);
//删除pos位置的元素
v.erase(pos);
//将两个元素的空间调换
vector<int> v2{ 6, 7, 8, 9 };
v.swap(v2);
自动扩容机制
以此为例,当有效元素都以及填满了vector的容量,此时使用push_back向后添加一个元素时,容器会在尾插前,先将容量扩充
vector自动扩充,会先创建一个大的新空间,将原来容器中的内容拷贝到新空间中,最后将vector的指向从旧空间改到新空间。一般扩容按照1.5倍增长
如果使用循环push_back的话,自动扩容会导致效率降低,所以一般情况先用reserve将容器扩容到合适大小,再进行循环尾插
迭代器
迭代器:类似指针的一种类型,可以将迭代器定义的对象当成指针的方式应用
作用:帮助用户透明(用户可以不用知道该容器的迪岑和数据结构)地遍历容器中的元素
函数 | 功能 |
---|---|
begin() | 获取第一个元素的位置 |
end() | 获取最后一个元素的下一个位置 |
//通过迭代器遍历容器中元素
vector<int> v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << endl;
it++;
}
迭代器失效
迭代器失效的场景
迭代器失效是由于在迭代器获取初始位置后,容器发生了内存扩容,旧空间被销毁了,导致一开始迭代器的指向了无效地址,导致出错,迭代器失效,也是指针失效
- pushi_back()自动扩容
- resize(),reserve(),insert()
解决迭代器失效
重新声明迭代器,push_back可能会导致迭代器失效,所以什么迭代器一般放在push_back后面的位置