2017-04-05 72 views
0

在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

回答

0

不仅它没用,而且可能是“有害的”。

这是没用的,因为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的 参考变量不允许您修改原始的容器 。它只影响副本,这可能不是你想要的。