【发布时间】:2012-01-26 16:14:27
【问题描述】:
我是 Qt 的新手,正在努力学习习语。
Qt 在进入 foreach 循环时自动获取容器的副本。如果您在迭代时修改容器,则不会影响循环。
但它并没有说明 如何 在使用 foreach 进行迭代时删除元素。我最好的猜测是:
int idx = 0;
foreach (const Foo &foo, fooList) {
if (bad(foo)) {
fooList.removeAt(idx);
}
++idx;
}
似乎很难将idx 限定在循环之外(并且必须维护一个单独的循环计数器)。
另外,我知道 是的,deep copy happens。foreach 复制了QList,这很便宜,但是一旦我删除一个元素会发生什么 - 仍然很便宜还是有一个昂贵的复制-修改正在进行吗?
编辑:这看起来也不是惯用的 Qt。
for (int idx = 0; idx < fooList.size(); ) {
const Foo &foo = fooList[idx];
if (bad(foo)) {
fooList.removeAt(idx);
}
else ++idx;
}
【问题讨论】:
-
为什么要使用
foreach? -
@Mat,我不必使用
foreach,它看起来很好用,文档似乎暗示有一些方法可以做到这一点。 Qt 似乎经过深思熟虑,我认为我正在尝试做的事情会有一些明显的习惯用法。 -
void QMutableListIterator::remove () 怎么样? developer.qt.nokia.com/doc/qt-4.8/…