【发布时间】:2014-06-30 01:02:01
【问题描述】:
文档只是states that it does,但没有解释原因:
当容器进入一个容器时,Qt 自动获取一个副本 foreach 循环。如果您在迭代时修改容器,那 不会影响循环。 (如果不修改容器,则复制 仍然发生,但由于隐式共享复制容器 非常快。)由于 foreach 创建了容器的副本,因此使用 变量的非常量引用不允许您修改 原始容器。它只影响副本,这可能不是 你想要什么。
对我来说,这看起来像是一个自我强加的障碍,使得 Qt 的 foreach 的用处不如它本来的用途 - 现在你不能用它来修改元素。
我听说 boost 的 foreach 和新的 C++11 for (auto iter : array) 不执行复制(尽管我对它们都不熟悉)。
那么复制背后的基本原理是什么?
【问题讨论】:
-
正确的修改方法是使用迭代器模式。
-
QT 喜欢 COW,因此他们广泛使用它来消除射中自己脚的方法。看看 C++ 标准库/boost 的迭代器失效规则,你可能会明白其中的优点。尽管如此,无论您是否依赖它,都会产生惩罚。
-
可能是因为很多人喜欢在迭代容器的时候修改容器,导致迭代器失效
-
sashoalm,“某种”的原因就在这里,stackoverflow.com/questions/4908107/…
-
在迭代容器时修改容器通常是错误的。只有在特定情况下才不会出错。如果您使用 Qt 容器,该副本非常便宜。如果你想修改容器,你应该直接使用迭代器,并以安全的方式使用它们。
标签: c++ qt foreach containers qtcore