如何通过比较彼此的成员从QStringList中删除元素

How to remove elements from QStringList by comparing each other members

本文关键字:QStringList 删除 元素 成员 何通过 比较      更新时间:2023-10-16

我有一个QStringList代码,它有一些文件名。

我需要比较每个文件内容并删除文件名(如果它具有相同的内容(。我需要删除具有相同内容的文件名,并且文件名按升序排列

。假设有 5 个文件名的文件 测试1 测试2 测试3 测试4 测试5

首先,我将比较测试 1 和测试 2 的文件内容,如果内容与列表中删除的测试 1 匹配,并且比较测试 2 和测试 3 的强度,如果内容不匹配,则 do +1 与迭代并比较 Test3 和 Test4 的内容,如果内容匹配,则删除 Test3,然后删除 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);

我已经测试过它并且它可以工作。