加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么在隐式共享容器上使用迭代器时首先要进行复制?

发布时间:2020-12-16 03:15:36 所属栏目:百科 来源:网络整理
导读:Qt的文档说明如下: Thanks to implicit sharing,it is very inexpensive for a function to return a container per value. The Qt API contains dozens of functions that return a QList or QStringList per value (e.g.,QSplitter::sizes()). If you wan
Qt的文档说明如下:

Thanks to implicit sharing,it is very inexpensive for a function to return a container per value. The Qt API contains dozens of functions that return a QList or QStringList per value (e.g.,QSplitter::sizes()). If you want to iterate over these using an STL iterator,you should always take a copy of the container and iterate over the copy. For example:

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

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

解决方法

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

基于范围的循环可以正常工作:for(int size:splitter-> sizes()){…}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读