C++学习随手记——vector(向量)

90 阅读3分钟

vector类定义了STL(标准模版库)提供的一种容器,满足动态数组的一般性描述。 我可以将它理解为Java中的ArrayList吗? 对比数组,向量有着自己的优势:

  1. 向量可以根据需要增长,而数组的长度是固定的。
  2. 向量可以与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个额外元素的的内存。这样就将向量的容量维持在足够满足需要,将内存的重新分配推迟到某个选定时刻发生。