vector 和数组,到底差在哪?
vector 和数组,到底差在哪?
刚学 C++ 的时候,最先接触的是数组:
int a[10];
后来又会看到一种写法:
vector<int> v;
很多人第一反应是:
这俩不都是“存一堆数据”的吗?
确实功能有重叠,但用起来差别还是挺明显的。
先看最直观的一点:大小能不能变。
数组一旦定义好,长度就固定了:
int a[5];
想再多放一个元素?不行,只能重新定义。
vector 就灵活得多:
vector<int> v;
v.push_back(1);
v.push_back(2);
需要多少就加多少,自动扩容,不用操心空间问题。
再看用起来的“手感”。
数组更偏底层,写法也更“硬”一点:
a[0] = 10;
a[1] = 20;
vector 除了可以这样用:
v[0] = 10;
还多了一些很好用的功能:
v.push_back(30); // 末尾加元素
v.pop_back(); // 删除最后一个
v.size(); // 当前有多少个元素
写起来会更顺手。
再说一个容易忽略的点:安全性。
数组不会帮检查越界:
a[10] = 100; // 很可能直接出问题
程序可能崩,也可能悄悄写坏内存。
vector 提供了一种更安全的访问方式:
v.at(10); // 越界会报错
当然,v[10] 这种写法还是不会检查,但至少多了一个更安全的选择。
内存这块也有点区别。
数组是在固定位置开一块连续空间,比较“死板”。vector 底层也是连续空间,但会在不够用的时候自动换一块更大的地方,再把数据搬过去。
这就是为什么 vector 能动态增长。
性能上也可以简单说一下。
数组因为简单,访问速度非常快,也没有额外开销。vector 在大多数情况下也很快,但在“扩容”的时候,会有一次整体复制的成本。
不过对于大多数练习和项目来说,这点差别基本感受不到。
什么时候用数组,什么时候用 vector?
可以这样简单判断:
如果一开始就知道数据规模,而且不会变,用数组就够了,比如:
int a[100];
如果数据个数不确定,或者需要频繁增加、删除元素,用 vector 更省心。
最后把两者放在一起看一眼:
数组更像是“固定大小的盒子”,提前规定好能装多少。vector 更像是“会自动变大的盒子”,不够装就自己扩展。
简单记一句就够用:
能确定大小,用数组
不确定大小,用 vector

