在Qt文档中有一个例子,他们使用
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构或只是m_data.clear();
是什么?
Qt示例page。
答案 0 :(得分:0)
不仅没用,而且可能有害&#34;。
这是无用的,因为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 doc:
没有效果由于foreach使用非const创建容器的副本 变量的引用不允许您修改原始变量 容器。它只会影响副本,这可能不是你的副本 想。