c++ - 如何通过比较其他成员从 QStringList 中删除元素
问题描述
我有一个 QStringList 代码,其中包含一些文件名。
我需要比较每个文件内容并删除文件名,如果它具有相同的内容。我需要删除具有相同内容的文件名,并且文件名按升序排列。
假设有 5 个文件名为 Test1 Test2 Test3 Test4 Test5
首先,我将比较测试 1 和测试 2 的文件内容,如果内容与从列表中删除的测试 1 以及测试 2 和测试 3 的比较内容匹配,如果内容不匹配,则对迭代执行 +1 并比较内容Test3 和 Test4 的内容,如果内容匹配,则删除 Test3,然后比较内容 Test2 和 Test4..
在迭代器的帮助下,我该如何做。我非常害怕使用擦除使迭代器无效。
解决方案
正如@Scheff提到的,我认为你可以直接使用索引QStringList::operator[]()
,这样你就不会冒迭代器失效的风险。
然后,您可以以相反的顺序(从最后一个元素到第一个元素)遍历文件名列表。
对于每个元素,从当前元素的开头到上一个元素再次迭代(内循环)。
如果当前元素和内部当前元素的内容相同,则可以移除当前元素。
当您以相反的顺序进行迭代时,您不会中断下一次迭代(删除的元素保证在下一次迭代将迭代的范围之外/之后)。
仅用文字很难解释这种算法,所以这里有一个代码示例来说明我的意思:
void remove_duplicates(QStringList & filenames)
{
for(int ri = filenames.size()-1; ri >= 0; --ri)
{
bool duplicate_found = false;
for(int i = 0; !duplicate_found && i < ri; ++i)
{
if(is_same_contents(filenames[ri], filenames[i]))
{
filenames.removeAt(ri);
duplicate_found = true;
}
}
}
}
当然,我在这里假设有一个函数可以比较两个文件的内容是否相等,定义为:
bool is_same_contents(const QString & filenameA, const QString & filenameB);
我已经对其进行了测试,并且可以正常工作。
推荐阅读
- html - 使右上角对齐的图像可点击
- apache-zookeeper - 如何为 Zookeeper 服务器启用 JMX 端口
- python - 单击来自 gmail 收件箱 Python 的特定电子邮件
- javascript - 即使将获取数据转换为数组,我也无法访问这些元素
- android - 如果用户长时间没有写入,如何使用 Firebase Cloud Functions 在 Firebase 数据库中设置节点的值?
- python - Python OpenHardwareMonitor 和 WMI 获取 cpu temps
- mongodb - 如何使用 MongoTemplate 在 MongoDB 中的嵌套文档上应用分组?
- html - 当我调整屏幕大小时,为什么我的 CSS 布局会不断中断?
- python - How to pass Dynamic values to Url by Loop using Python
- c# - 在Entity Framework中映射关系而不在表中映射有什么好处