4

在这篇文章再见,来自 KDAB 的 Q_FOREACH,他们警告说,基于范围的for可能会导致 Qt 容器的分离。
另请参阅:在 Qt 中正确使用 C++11 基于范围的 for 循环

我知道这for会导致分离,因为如果容器不是 const,它会调用一些非常量迭代器。返回值
是否相同? 该函数是 const 所以我的地图不会分离,但返回值是按值传递的,所以我会复制 QList 两次吗?QHash::keys()
keys()

那么,我应该像这样循环吗?

for(auto key : qAsConst(map.keys())) {
    // do something with key or map.value(key)
}
4

2 回答 2

3

不,它甚至没有编译(Qt5.9 - MSVC 2015):

QMap<QString, int> map;
for(auto key : qAsConst(map.keys())) {
    // do something with key or map.value(key)
}

错误:使用已删除的函数 'void qAsConst(const T&&) [with T = QList]'

于 2017-11-07T13:19:00.217 回答
2

创建一个临时的 keys() 容器只是为了对其进行迭代,无论如何都是一个非常慢的解决方案。更喜欢使用迭代器。

于 2020-11-03T14:09:34.460 回答