为什么在隐式共享容器上使用迭代器时必须先复制
Why necessary to make copy first when using iterator on implicitly shared container?
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()) { ... }
相关文章:
- C++:复制迭代器的构造函数
- 复制和交换习语和迭代器
- 如何复制只有两个迭代器的数据?
- 复制映射迭代器对值的省略
- 将迭代器范围复制到矢量而不重复
- C++ std::map 和 std::set 擦除复制值,从而使迭代器失效
- 使用迭代器将向量复制到数组中
- 将指针而不是迭代器传递到std ::复制
- 实现如何保证迭代器的复制构造函数不会抛出
- C++使用迭代器复制文本文件
- 无法复制到输出迭代器
- 具有四个迭代器的类似复制的算法
- 为什么 std::copy 抛出错误向量迭代器 + 偏移量超出范围并且无法复制
- 正在将传递给构造函数的迭代器复制到向量
- 从迭代器复制C++对象
- 将指针包装到迭代器中,以便复制到STL容器中
- 迭代器复制构造函数错误,作为右侧'.'运算符非法
- 使用CUDA Thrust置换迭代器复制数组的特定元素
- 深度复制Vector时,Vector迭代器不兼容
- 为什么在隐式共享容器上使用迭代器时必须先复制