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.