Qvectors的QList清楚

时间:2017-04-05 09:28:27

标签: qt qlist qvector

在Qt文档中有一个例子,他们使用

foreach (QVector<QPointF> row, m_data)
    row.clear();
m_data.clear();

清除<QList<QVector<QPointF> > m_data;

是否有必要使用这样的结构或只是m_data.clear();是什么?

Qt示例page

1 个答案:

答案 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创建容器的副本   变量的引用不允许您修改原始变量   容器。它只会影响副本,这可能不是你的副本   想。