我努力找到一个安全的解决方案(害怕迭代器无效)来删除QStringList
中的一些元素:
static QStringList s_listDistantDirs;
如果元素CurrentElement
的长度优于其他元素OtherElement
且OtherElement
等于CurrentElement.mid(OtherElement.length())
,我想删除它。
换句话说,我想删除列表中现有目录的子目录。
我尝试使用QMutableListIterator<QString>
,但我不知道如何正确使用它来嵌套循环。
答案 0 :(得分:2)
换句话说,我想删除列表中现有目录的子目录。
如果事先知道现有目录,您可以使用QStringList::filter()和这样的正则表达式:
#include <QtCore>
#include <QRegularExpression>
#include <QStringList>
#include <QDebug>
int main() {
QString myPath("/my/path/");
QRegularExpression re("^(?!" + myPath + ")");
QStringList list = (QStringList()
<< "/my/path/a"
<< "/my/path/b"
<< "/some/other/path/c"
<< "/my/path/d");
for(auto &l: list.filter(re)) {
qDebug() << l;
}
}
答案 1 :(得分:2)
你可能想要这样的东西:
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`!
}
}
可以在同一列表中使用多个迭代器。如果在QListIterator处于活动状态时修改了列表,则QListIterator将继续迭代原始列表,忽略修改后的副本。
但效率很低,此时最好只使用一些数据结构,比如前缀树。