为什么在隐式共享容器上使用迭代器时必须先复制

Why necessary to make copy first when using iterator on implicitly shared container?

本文关键字:迭代器 复制 共享 为什么      更新时间:2023-10-16

Qt的文档是这样说的:

由于隐式共享,函数为每个值返回一个容器的成本非常低。Qt API包含几十个函数,每个值返回一个QList或QStringList(例如,QSplitter::sizes())。如果希望使用STL迭代器遍历这些对象,则应该始终获取容器的一个副本,并遍历该副本。例如:

// RIGHT
const QList<int> sizes = splitter->sizes();
QList<int>::const_iterator i;
for (i = sizes.begin(); i != sizes.end(); ++i)
    ...
// WRONG
QList<int>::const_iterator i;
for (i = splitter->sizes().begin();
        i != splitter->sizes().end(); ++i)
    ...

如果应用'Wrong'方法会发生什么?

splitter->sizes()的两次调用产生容器的两个不同副本。由于begin()来自其中一个,end()来自另一个,它们不构成有效范围。然后循环将从第一个容器的末端走到未定义行为的区域。

基于范围的循环将工作得很好:for (int size: splitter->sizes()) { ... }