在 Qt 文档中有一个例子,他们使用
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
有必要使用这样的结构还是m_data.clear();
足够?
Qt 示例页面。
它不仅无用,而且可能是“有害的”。
它是无用的,因为QList<T>::clear()
会破坏它有效调用的每个 T ~T()
。在您的情况下,这意味着您最终会调用~QVector<QPointF>()
QList 中的每个向量。然后~QVector<QPointF>()
将要求~QPointF()
每一点。
由于 QList 和 QVector 使用 Copy-on-Write,这可能会损害性能。这意味着,当您复制列表时,您不会复制内部数据,但只要您执行将修改列表之一的操作,就会发生复制。
因此,如果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 doc,它将没有任何效果:
由于 foreach 创建了容器的副本,因此对变量使用非常量引用不允许您修改原始容器。它只影响副本,这可能不是您想要的。