该文档只是states that it does,但没有解释原因:



对我来说,这似乎是一个自我强加的障碍,这使得Qt的foreach比以前没有用的多了-现在您不能使用它来修改元素。

我听说boost的foreach和新的C++ 11 for (auto iter : array)不会执行复制(尽管我对它们中的任何一个都不熟悉)。

那么,复制背后的原理是什么?

最佳答案

Qt开发人员已经决定了用例,当您在循环中修改容器(例如在信号处理程序,A。k。a。插槽等)而不修改原始容器时,应避免出现意外情况。

使用信号时隙机制来跟踪是否修改了某些内容可能会很棘手。如果与该容器成员一起发出信号,则基本上取决于插槽。可以肯定的是,否则您总是需要进行外部复制。

另一个优点是,您可以将方法调用传递给第二个参数,而无需进行连续的重新评估,因为该拷贝将是第一次创建。如果您问我,这实际上是一个很好的功能,因为您经常希望遍历关联的数组键或值,例如myHash.keys()myHash.values()

您可能会争辩说,升压也具有信号时隙机制。是的,我认为这只是一种不同的处理方式。他们不必总是做同样的事情。 :-)

不同的人对API,样式等有不同的口味。毕竟,您掌握了所有工具,可以实现计划要使用的任何用例。

您也可能会争辩说它可能不是您想要的,而是应该进行显式复制。这很公平,您可以使用Boost或C++中的标准foreach达到最大程度。

在这里,拷贝没有性能问题,因为对于正常迭代而言,无需修改,写时复制(也称为隐式共享)就足够了。它有一些性能开销,但是可以忽略不计。

对于这种用例,正确的Qt语义将是使用迭代器设计模式。例如,Qt在“Java风格”之后的各处都有迭代器类。

关于c++ - 为什么Qt foreach创建容器的拷贝?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23612885/

10-15 01:31
查看更多