Qt QList-of-Qvectors-clear

Qt QList-of-Qvectors-clear,qt,qlist,qvector,Qt,Qlist,Qvector,在Qt文档中有一个示例,其中他们使用 foreach (QVector<QPointF> row, m_data) row.clear(); m_data.clear(); foreach(QVector行,m_数据) row.clear(); m_data.clear(); 清除不仅无用,而且可能“有害” 它是无用的,因为QList::clear()将破坏它拥有的每一个T,有效地调用~T()。在您的例子中,这意味着您将为QList中的每个向量调用~QVector()。然

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

foreach (QVector<QPointF> row, m_data)
    row.clear();
m_data.clear();
foreach(QVector行,m_数据)
row.clear();
m_data.clear();

清除
不仅无用,而且可能“有害”

它是无用的,因为
QList::clear()
将破坏它拥有的每一个T,有效地调用
~T()
。在您的例子中,这意味着您将为QList中的每个向量调用
~QVector()
。然后,
~QVector()
将为每个点调用
~QPointF()

这可能对性能有害,因为QList和QVector使用写时复制。这意味着,当您复制一个列表时,您不会复制内部数据,但只要您执行修改其中一个列表的操作,就会发生复制

因此,如果
m_data
与另一个QList共享其内部数据,则更改其任何元素(例如,对其中一个元素调用
QVector::clear()
)将触发QList内部数据的硬拷贝。而且这个副本是完全无用的,因为您在调用
m\u data.clear()
之后就丢弃了它


还值得注意的是:

foreach (QVector<QPointF> row, m_data)
    row.clear();
引用Qt文件时,其无效:

因为foreach使用非常量创建容器的副本 变量的引用不允许修改原始变量 容器。它只影响副本,而副本可能不是您想要的 需要

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