2016-12-22 65 views
1

我在努力尋找一個安全的解決方案(怕迭代器失效)擦除一些元素QStringList如何刪除多餘的元素在QStringList中

static QStringList s_listDistantDirs; 

我想如果刪除元素CurrentElement其長度優於其他元素OtherElement,並且如果OtherElement等於CurrentElement.mid(OtherElement.length())

換句話說,我想擦除列表中存在的目錄的子目錄。

我試圖使用QMutableListIterator<QString>,但我不知道如何正確使用它來嵌套循環。

+0

對我而言,這並不十分清楚,您是否想要擦除特定目錄的子目錄(該目錄是在列表本身的外部指定的),還是想要通過指示燈並刪除所有子目錄任何其他路徑的列表也在列表中? –

回答

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`! 
    } 
} 

Qt documentation

可以使用多個迭代器d在同一張名單上。如果在QListIterator處於活動狀態時修改列表,則QListIterator將繼續遍歷原始列表,忽略修改後的副本。

但是效率很低,在這一點上最好只使用一些數據結構,比如前綴樹。

+0

我改變了QStringListIterator的可變版本,並刪除了.value()(該成員不存在),它的工作!謝謝 ! – Aminos

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; 
    } 
}