QT中高效比较两个QStringList,获取list2独有元素的最优方法
高效筛选QStringList中不存在元素的方案
原嵌套循环实现的元素筛选逻辑在数据量较大时,因O(n*m)的时间复杂度导致性能瓶颈,以下是两种无需嵌套循环的高效实现方式,适配你每次刷新数据时从新数据集(list2)中筛选旧数据集(list1)不存在元素的业务场景。
原实现代码
QStringList list1 = {"12420", "23445", "8990", "09890", "32184", "31111"}; QStringList list2 = {"8991", "09890", "32184", "34213"}; QStringList list3; for (int i = 0; i < list2.size(); ++i) { bool exists = false; for (int j = 0; j < list1.size(); ++j) { if(list2[i] == list1[j]){ exists = true; break; } } if(!exists) list3.append(list2[i]); } qDebug() << list3; // 输出: ("8991", "34213")
方法一:使用QSet实现O(1)查找
将list1转换为QSet,利用其平均O(1)时间复杂度的contains方法快速判断元素是否存在,整体时间复杂度降至O(n+m),大数据量下性能提升显著:
QStringList list1 = {"12420", "23445", "8990", "09890", "32184", "31111"}; QStringList list2 = {"8991", "09890", "32184", "34213"}; QStringList list3; // 将list1转换为QSet,构建快速查找结构 QSet<QString> existingElements(list1.begin(), list1.end()); // 遍历list2,筛选不在set中的元素 for (const QString& item : list2) { if (!existingElements.contains(item)) { list3.append(item); } } qDebug() << list3; // 输出: ("8991", "34213")
方法二:使用QHash实现等效高效查找
QSet底层基于QHash实现,也可以直接用QHash完成相同逻辑,效果一致:
QStringList list1 = {"12420", "23445", "8990", "09890", "32184", "31111"}; QStringList list2 = {"8991", "09890", "32184", "34213"}; QStringList list3; QHash<QString, bool> existingElements; for (const QString& item : list1) { existingElements.insert(item, true); } for (const QString& item : list2) { if (!existingElements.contains(item)) { list3.append(item); } } qDebug() << list3; // 输出: ("8991", "34213")
注意事项
- 两种方法都能保持list2中元素的原有顺序,符合业务需求
- 若list1的内容每次刷新都会更新,每次构建QSet/QHash的开销远低于嵌套循环的迭代成本
- 对于重复元素较多的场景,QSet会自动去重,但不影响筛选逻辑(只要list1中存在该元素就会被排除)
内容的提问来源于stack exchange,提问作者BadRobot
相关产品推荐
相关产品推荐

