Qvectors 的 QList 清除

Posted

技术标签:

【中文标题】Qvectors 的 QList 清除【英文标题】:QList of Qvectors clear 【发布时间】:2017-04-05 09:28:27 【问题描述】:

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

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

清除&lt;QList&lt;QVector&lt;QPointF&gt; &gt; m_data;

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

Qt 示例page.

【问题讨论】:

【参考方案1】:

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

这是没用的,因为QList&lt;T&gt;::clear() 将销毁它拥有的每一个 T,有效地调用~T()。在您的情况下,这意味着您最终会为 QList 中的每个向量调用 ~QVector&lt;QPointF&gt;()。然后~QVector&lt;QPointF&gt;() 将为每个点调用~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 使用非常量创建容器的副本 变量的引用不允许您修改原始 容器。它只影响副本,这可能不是你的 想要。

【讨论】:

以上是关于Qvectors 的 QList 清除的主要内容,如果未能解决你的问题,请参考以下文章

QVectors 的 QHash

C++ 继承 - QList

qlist中的条件qlist.count

指向 QList 中元素的指针

将 QList<std::string> 转换为 QList<QString>

QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度