gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:35:24 27 4
gpt4 key购买 nike

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()) { ... }

关于c++ - 为什么在隐式共享容器上使用迭代器时必须先复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com