我正在努力寻找一种安全的解决方案(避免迭代器无效),以消除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:



但这是非常低效的,此时最好只使用某些数据结构,例如前缀树。

09-29 21:43