如何优化大型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 documentation

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());

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...