矢量矢量的实现

时间:2014-05-24 12:38:31

标签: c++ std

如何实施:vector <vector <T> > a;

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

2 个答案:

答案 0 :(得分: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  | ----> ...
                 +--------+
                    ...

答案 1 :(得分:-1)

数组是固定大小的,std :: vector使用数组,但实现将根据需要重新分配数组。