【问题标题】:QList of Qvectors clearQvectors 的 QList 清除
【发布时间】: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.

【问题讨论】:

    标签: qt qlist qvector


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多