我正在努力寻找一种安全的解决方案(避免迭代器无效),以消除QStringList
中的某些元素:
static QStringList s_listDistantDirs;
我想删除一个元素
CurrentElement
,如果它的长度比另一个元素OtherElement
更好,并且OtherElement
等于CurrentElement.mid(OtherElement.length())
。换句话说,我要删除列表中现有目录的子目录。
我尝试使用
QMutableListIterator<QString>
,但我不知道如何正确使用它来嵌套循环。 最佳答案
您可能想要这样的东西:
static QStringList s_listDistantDirs;
//...
QStringListIterator it(s_listDistantDirs);
while (it.hasNext()) {
QString& otherElement = it.next().value();
// QMutableStringListIterator is just a typedef for QMutableIterator<QString>
QMutableStringListIterator mit(s_listDistantDirs);
while(mit.hasNext()) {
QString& currentElement = mit.next().value();
if (currentElement.length() > otherElement.length()
&& currentElement.startsWith(otherElement))
mit.remove(); // this will not invalidate `it`!
}
}
根据Qt documentation:
但这是非常低效的,此时最好只使用某些数据结构,例如前缀树。