针对具体情况:
显然foreach
循环根本不应该用于修改列表,因为foreach
循环实际上是在处理原始列表的副本。如果你修改它,你不仅会因为隐式共享和写时修改而受到惩罚,而且一旦你退出循环,你的更改也会被丢弃。
实现此目的的正确方法是使用迭代器。我更喜欢 Java 风格的迭代器。您会注意到,每种列表类型都有提供简单迭代器的迭代器类。例如QLinkedList
,有一个类QMutableLinkedListIterator
。它可以按如下方式使用:
从Qt 文档中添加了我的评论:
QMutableLinkedListIterator<int> i(list); // pass list as argument
while (i.hasNext()) {
int val = i.next(); // retrieve value of current item
if (val < 0) {
i.setValue(-val); // change/set value of current item
} else if (val == 0) {
i.remove(); // delete current item
}
}
对于一般情况:
如果您使用的是除 之外的 Qt 数据结构QLinkedList
,那么很有可能有一个迭代器类适合您。如果要修改列表,请使用可变版本。这些 API 大致相同。以下是课程:
Structure | Immutable Case | Mutable Case
-----------------------------------------------------
QList | QListIterator | QMutableListIterator
QLinkedList | QLinkedListIterator | QMutableLinkedListIterator
QHash | QHashIterator | QMutableHashIterator
QMap | QMapIterator | QMutableMapIterator
QSet | QSetIterator | QMutableSetIterator
QStringList | QStringListIterator | QMutableStringListIterator
QVector | QVectorIterator | QMutableVectorIterator