以下是来自github的QVector附加()的实现:
template <typename T>
void QVector<T>::append(const T &t)
{
if (d->ref != 1 || d->size + 1 > d->alloc) {
const T copy(t);
realloc(d->size, QVectorData::grow(sizeOfTypedData(), d->size + 1, sizeof(T),
QTypeInfo<T>::isStatic));
if (QTypeInfo<T>::isComplex)
new (p->array + d->size) T(copy);
else
p->array[d->size] = copy;
} else {
if (QTypeInfo<T>::isComplex)
new (p->array + d->size) T(t);
else
p->array[d->size] = t;
}
++d->size;
}
如果对向量的引用数量!= 1或者需要调整大小以及为什么只为这些条件制作副本,为什么需要复制t
?
已经询问了一个相关的问题here,但在代码中,在附加到基础数组之前总是会生成t
的副本。
答案 0 :(得分:3)
快速浏览一下,可能是因为if
部分用于向量重新分配,而else
部分用于何时不进行向量重新分配。当它重新分配时,用户可能已完成vector.append(vector[index])
,在这种情况下t
在重新分配后将变为无效,因此必须在重新分配之前进行复制。在没有重新分配的else
部分t
将保持有效,无需复制。