簡體   English   中英

如何優化大 QStringList 的代碼?

[英]How can I optimize the code for big QStringList?

如果 list2 包含超過 200,000 個條目,則以下代碼似乎無法在可容忍的時間內完成。

    QStringList list1; 
    QStringList list2=getalist();
    int count=list2.count();
    for(int j=0;j<count;j++)
    {
        QString e=list2[j];
        if(!list1.contains(e,Qt::CaseInsensitive))
        {
            list1<<e;
        }
    }

瓶頸是什么,我該如何優化它?

瓶頸是選擇QStringList作為該任務的容器。 它是一個QList<QString>並且我相信它使用線性搜索來實現函數contains

最好的解決方案是使用像 std::set 這樣的基於樹的容器或像QSet這樣的基於散列的容器(是的,它基於散列與 std::set 相反)。 從 Qt文檔

QSet 是 Qt 的通用容器類之一。 它以未指定的順序存儲值並提供非常快速的值查找 在內部,QSet 是作為 QHash 實現的。

您的代碼似乎將list1更新為list1list2中所有唯一元素的聯合,但不區分大小寫。 所以像(未經測試)......

QStringList list1;
QStringList list2 = getalist();

struct case_insensitive_compare {
    bool operator() (const QString &l, const QString &r) const
    {
        return l.compare(r, Qt::CaseInsensitive) < 0;
    }
};

std::set<QString, case_insensitive_compare> set1(list1.begin(), list1.end());
set1.insert(list2.begin(), list2.end());
list1 = QStringList(set1.begin(), set1.end());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM