首页 > 解决方案 > 如何通过比较其他成员从 QStringList 中删除元素

问题描述

我有一个 QStringList 代码,其中包含一些文件名。

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

假设有 5 个文件名为 Test1 Test2 Test3 Test4 Test5

首先,我将比较测试 1 和测试 2 的文件内容,如果内容与从列表中删除的测试 1 以及测试 2 和测试 3 的比较内容匹配,如果内容不匹配,则对迭代执行 +1 并比较内容Test3 和 Test4 的内容,如果内容匹配,则删除 Test3,然后比较内容 Test2 和 Test4..

在迭代器的帮助下,我该如何做。我非常害怕使用擦除使迭代器无效。

标签: c++qt

解决方案


正如@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);

我已经对其进行了测试,并且可以正常工作。


推荐阅读