如何通过比较彼此的成员从QStringList中删除元素
How to remove elements from QStringList by comparing each other members
我有一个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);
我已经测试过它并且它可以工作。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 删除所有字符串后如何恢复 QStringList?
- 如何通过比较彼此的成员从QStringList中删除元素
- 如何从 QStringList 中删除空字符串和空字符串
- 从QStringList中删除子目录,仅保留父母的目录
- 如何删除 QStringList 中的冗余元素
- 在QT中删除QStringList
- 使用迭代器从 QStringlist 中删除项目
- 从另一个QStringList中删除一个QStringList中包含的字符串
- QStringList删除字符串中的空格