[英]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
更新為list1
和list2
中所有唯一元素的聯合,但不區分大小寫。 所以像(未經測試)......
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.