在Qt文档有一个例子,在那里他们使用的QList Qvectors明确
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构,或只是m_data.clear();
是enoungh?
Qt示例page。
在Qt文档有一个例子,在那里他们使用的QList Qvectors明确
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构,或只是m_data.clear();
是enoungh?
Qt示例page。
不仅它没用,而且可能是“有害的”。
这是没用的,因为QList<T>::clear()
会破坏它拥有的每个T有效呼叫~T()
。在你的情况下,这意味着你最终会为QList中的每个向量调用~QVector<QPointF>()
。然后~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的文档:
因为的foreach创建容器的一个副本,使用非const的 参考变量不允许您修改原始的容器 。它只影响副本,这可能不是你想要的。