Qvector 的 QList 清除
QList of Qvectors clear
在 Qt 文档中有一个例子,他们使用
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构,或者只是 m_data.clear();
就足够了?
Qt 示例 page.
不仅没用,还可以"harmful".
它是无用的,因为 QList<T>::clear()
会有效地调用 ~T()
销毁它拥有的每个 T。在您的情况下,这意味着您最终会为 QList 中的每个向量调用 ~QVector<QPointF>()
。然后 ~QVector<QPointF>()
将为每个点调用 ~QPointF()
。
因为 QList 和 QVector 使用写时复制,所以这可能对性能有害。这意味着当您复制列表时,您不会复制内部数据,但只要您执行将修改列表之一的操作,就会发生复制。
因此,如果 m_data
与另一个 QList 共享其内部数据,更改其任何元素(例如,通过对其中一个调用 QVector::clear()
)将触发 QList 内部数据的硬拷贝.这个副本完全没用,因为你在调用 m_data.clear()
.
之后就丢弃了它
还值得注意的是:
foreach (QVector<QPointF> row, m_data)
row.clear();
不变 m_data
。您清除 row
这是一个局部变量。即使你写完了:
foreach (QVector<QPointF> &row, m_data)
row.clear();
它不会有任何效果,引用 Qt 文档:
Since foreach creates a copy of the container, using a non-const
reference for the variable does not allow you to modify the original
container. It only affects the copy, which is probably not what you
want.
在 Qt 文档中有一个例子,他们使用
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构,或者只是 m_data.clear();
就足够了?
Qt 示例 page.
不仅没用,还可以"harmful".
它是无用的,因为 QList<T>::clear()
会有效地调用 ~T()
销毁它拥有的每个 T。在您的情况下,这意味着您最终会为 QList 中的每个向量调用 ~QVector<QPointF>()
。然后 ~QVector<QPointF>()
将为每个点调用 ~QPointF()
。
因为 QList 和 QVector 使用写时复制,所以这可能对性能有害。这意味着当您复制列表时,您不会复制内部数据,但只要您执行将修改列表之一的操作,就会发生复制。
因此,如果 m_data
与另一个 QList 共享其内部数据,更改其任何元素(例如,通过对其中一个调用 QVector::clear()
)将触发 QList 内部数据的硬拷贝.这个副本完全没用,因为你在调用 m_data.clear()
.
还值得注意的是:
foreach (QVector<QPointF> row, m_data)
row.clear();
不变 m_data
。您清除 row
这是一个局部变量。即使你写完了:
foreach (QVector<QPointF> &row, m_data)
row.clear();
它不会有任何效果,引用 Qt 文档:
Since foreach creates a copy of the container, using a non-const reference for the variable does not allow you to modify the original container. It only affects the copy, which is probably not what you want.