最近我重新阅读了ISO C++标准,发现了非常有趣的注释:
请注意,对于
std::vector
,std::vector<T>
类型的唯一限制是类型T
必须具有复制构造函数。实际上,如果在插入时向量的内存已满,则会分配一个新的size = 2 * oldSize
(这取决于实现)的内存,然后将旧元素复制到其中并插入那个元素。
但是等等?
为了分配新的类型内存,我们需要像这样的东西:ptr = new T[2*size];
- 这是如何实现的,因为类型
T
可能没有默认构造函数? - 然后进行赋值,在分配内存后,我们必须将旧值分配给新内存,对吗?
- 考虑到这两点,
std::vector
如何仅使用“COPY CONSTRUCTOR”来完成此操作?使用了哪些实现和语言习惯用法?
new
完成的。数组-new
是语言中完全错误的设计,而且毫无用处,正如你所发现的一样。相反,内存分配和对象构造完全是分开进行的。 - Kerrek SBnew
适用于分配数组。你可以认为显式手动分配是不好的(在这种情况下,你反对new
、delete
、new[]
和delete[]
,很可能也反对原始指针),但这与仅仅认为 array-new
不好是不同的。 - user253751std::vector
即可。 - Kerrek SB