【发布时间】:2017-09-19 03:31:27
【问题描述】:
我有 int 的 QList。
eg: [10,10];
那我想把值减1。
我试过了:
foreach (int val, valList) {
val-= 1;
}
但是 valList 的 qDebug 显示它们的值仍然为 10。我做错了什么?
【问题讨论】:
我有 int 的 QList。
eg: [10,10];
那我想把值减1。
我试过了:
foreach (int val, valList) {
val-= 1;
}
但是 valList 的 qDebug 显示它们的值仍然为 10。我做错了什么?
【问题讨论】:
您不能使用foreach 更改您正在迭代的容器中的值,正如the official documentation 所说:
当容器进入一个容器时,Qt 自动获取一个副本 foreach 循环。如果您在迭代时修改容器,那 不会影响循环。 (如果不修改容器,则复制 仍然发生,但由于隐式共享复制容器 非常快。)
由于 foreach 使用非常量创建容器的副本 变量的引用不允许您修改原始 容器。它只影响副本,这可能不是你的 想要。
Qt 的 foreach 循环的替代方案是基于范围的 for,即 C++ 11 和更新版本的一部分。但是,请记住,基于范围的 for 可能会强制 Qt 容器分离,而 foreach 不会。 但是使用 foreach 总是复制容器,这通常不是 STL 容器便宜。如果有疑问,请选择 foreach for Qt 容器,以及基于 STL 容器的范围。
【讨论】:
我会在 C++ 11 及更高版本中尝试这个:
void changeIntVals(QList<int>& valList)
{
for(auto& val: valList)
{
val -= 1;
}
}
附:没试过编译。
【讨论】: