【问题标题】:How can I optimize the code for big QStringList?如何优化大 QStringList 的代码?
【发布时间】:2021-01-05 11:53:01
【问题描述】:

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

什么是瓶颈,如何优化它?

【问题讨论】:

  • 对于初学者不要在Qt6之前使用QList
  • QStrings 是重量级的,你正在循环创建一个。它可能会被优化掉,也可能不会。如果您的代码表现不佳,我不会打赌

标签: qt sorting optimization qstring qstringlist


【解决方案1】:

瓶颈是选择QStringList 作为该任务的容器。它是一个QList&lt;QString&gt;,我相信它使用线性搜索来实现函数contains

最好的解决方案是使用像 std::set 这样的基于树的容器或像 QSet 这样的基于散列的容器(是的,它基于散列与 std::set 相反)。来自Qtdocumentation

QSet 是 Qt 的通用容器类之一。它将值存储在 未指定的顺序并提供非常快速的查找值。 在内部,QSet 被实现为 QHash。

【讨论】:

  • 切换到QSet后,代码瞬间完成。谢谢你!
【解决方案2】:

您的代码似乎将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());

【讨论】:

  • @deW1 啊,对。 list1 可能已经有重复项。我会等待 OP 发表评论。
  • @G.M.您的代码也很棒,尤其是它可以处理不区分大小写的问题。列表中的冗余条目也被删除。但是“list1 = QStringList(set1.begin(), set1.end());”这一行无法在我的机器上编译,可能是因为我的 qt 版本太旧(Qt 5.12)。所以我采用了 Vasilij 的回答。谢谢!
猜你喜欢
  • 2022-11-23
  • 2015-09-19
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2014-12-31
相关资源
最近更新 更多