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();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构,还是仅仅m_data.clear();
就足够了?
Qt 示例page.
【问题讨论】:
【参考方案1】:它不仅没用,而且可能是“有害的”。
这是没用的,因为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 使用非常量创建容器的副本 变量的引用不允许您修改原始 容器。它只影响副本,这可能不是你的 想要。
【讨论】:
以上是关于Qvectors 的 QList 清除的主要内容,如果未能解决你的问题,请参考以下文章
将 QList<std::string> 转换为 QList<QString>
QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度