矢量矢量的实现

nik*_*yas -1 c++ std

这是如何实现的:vector <vector <T> > a;

每个向量都包含一个底层数组,但要有一个数组需要一个常量,但vector(它是外向量的数据类型)具有可变大小.如果它是由指针实现的,那么c ++知道何时使用指针以及何时使用直接值.

小智 7

std::vector<T>对象具有固定的和相当小的sizeof.它通常包含一个指向数组的指针,该数组T的长度(它的"容量"),以及当前使用了多少该数组(向量的逻辑大小).假设一个64位系统,这三个字段总计为8 + 8 + 8 = 24字节,那就是你的sizeof(vector<T>).请注意,无论是什么T(它可能是另一种矢量类型,或其他任何东西)以及矢量存储了多少元素,这都是相同的.当您创建向量(在此平台上)时,无论是作为局部变量还是作为数组元素或其他位置,您只能分配24个字节.在一些构造函数或向量的方法中,数组的分配是独立发生的.

容量确实是可变的(否则向量将没有用),但这没有问题,我们可以动态分配它并使我们的指针指向该分配.无论如何,vector对象仅包含指向实际存储的指针.

您仍然可以复制向量的原因,就好像它们确实包含任意数量的数据作为成员一样,它定义了它的构造函数和其他操作来解释该"外部"数组.例如,复制向量时,复制构造函数还会创建一个新数组,复制所有内容,并存储指向新数组的指针.用行话:每个向量都有其后备数组的唯一所有权.

因此,矢量矢量可能在内存中看起来像这样:

+--------+
| length |
|capacity|
|  data  | ----> +--------+
+--------+       | length |
                 |capacity|
                 |  data  | ----> ...
                 +--------+
                 | length |
                 |capacity|
                 |  data  | ----> ...
                 +--------+
                    ...
Run Code Online (Sandbox Code Playgroud)