vector类定义了STL(标准模版库)提供的一种容器,满足动态数组的一般性描述。 我可以将它理解为Java中的ArrayList吗? 对比数组,向量有着自己的优势:
- 向量可以根据需要增长,而数组的长度是固定的。
- 向量可以与STL算法一起使用,而数组不能。使用向量的话,就可以从标准模板库中调用以实现查找排序这样的功能,而数组若要实现这样的功能需要自行编写用于实现这些功能的代码。
当然,使用向量需要一些额外的内存开销,且随着向量大小的增长,可能会造成一些性能上的损失。如若要进行大量的增删操作,则向量不如list(线性列表)更加节省开销。
在使用向量前,必须将含有其定义的头文件包含进来:
#include <vector>
声明向量的方式
以字符串类型为例
//最简单的方式
vector<string> str;
//声明有初始大小的值
vector<string> str(10);
//声明有初始大小的值,且用相同的值初始化所有元素
vector<string> str(10, "Hello");
//也可以用另一个向量的内容声明和初始化一个向量
vector<string> new_str(str);
向量可用的常见成员函数
- push_back():在向量的最后添加一个新的元素
- size():获取向量的大小
- pop_back():移除向量的最后一个元素,并且将向量的大小减1
- clear():移除向量的全部元素,使得此向量成为一个空向量
- empty():检查向量是否为空,返回一个布尔值
- capacity():返回向量的容量
- reverse():将向量的容量扩充至给定实参的大小
- insert(a,b):在位置a前插入b
- erase(a):删除第a个元素
向量的大小和容量
需要注意的是,向量的大小和容量并非同一概念。向量的大小是向量当前容纳元素的数目。
vector<string> strs(5, "Hello");
此时,向量strs的大小和容量均为5.但假若使用push_back()在该向量的末尾添加一个元素之后,向量的大小变为6,容量则会变为10,。这是因为程序每次给向量重新分配额外的内存时,其容量都会增大一倍。也就是说是指数级增长吗,下一次分配额外内存的时候,容量会增大为20?
可以使用reverse()来控制分配额外内存的时机。
vector<string> strs(5,"Hello");
strs.reverse(20);
在上述代码中,strs的大小是5,但在执行reverse()之后,容量会变成20,即通过此成员函数为这个向量预留了15个额外元素的的内存。这样就将向量的容量维持在足够满足需要,将内存的重新分配推迟到某个选定时刻发生。