在隐式共享容器上使用迭代器时,为什么需要先复制?

时间:2016-09-01 15:39:24

标签: c++ qt

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)
    ...

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

1 个答案:

答案 0 :(得分:12)

splitter->sizes()的两次调用产生两个不同的容器副本。由于begin()来自另一个end()而另一个来自for (int size: splitter->sizes()) { ... },因此它们不会形成有效范围。然后循环将从第一个容器的末端走出,进入未定义行为的土地。

基于范围的循环可以正常工作:{{1}}