0

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

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

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

有必要使用这样的结构还是m_data.clear();足够?

Qt 示例页面

4

1 回答 1

0

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

它是无用的,因为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 创建了容器的副本,因此对变量使用非常量引用不允许您修改原始容器。它只影响副本,这可能不是您想要的。

于 2017-04-05T10:29:44.303 回答