Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过比较其他成员从QStringList中删除元素_C++_Qt - Fatal编程技术网

C++ 如何通过比较其他成员从QStringList中删除元素

C++ 如何通过比较其他成员从QStringList中删除元素,c++,qt,C++,Qt,我有一个QStringList代码,其中包含一些文件名 我需要比较每个文件的内容,并删除文件名,如果它有相同的内容。我需要删除具有相同内容的文件名,文件名升序较大 假设有5个文件名为 测试1 测试2 测试3 测试4 测试5 首先,我将比较测试1和测试2的文件内容,如果内容匹配从列表中删除测试1,比较测试2和测试3的内容,如果内容不匹配,则将do+1与迭代进行比较,并比较测试3和测试4的内容,如果内容匹配,则删除测试3,然后删除测试2和测试4 我如何使用迭代器呢。我非常害怕使用erase使迭代器无

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

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

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

首先,我将比较测试1和测试2的文件内容,如果内容匹配从列表中删除测试1,比较测试2和测试3的内容,如果内容不匹配,则将do+1与迭代进行比较,并比较测试3和测试4的内容,如果内容匹配,则删除测试3,然后删除测试2和测试4

我如何使用迭代器呢。我非常害怕使用erase使迭代器无效。

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

我已经对它进行了测试,它可以工作。

尝试使用@Pedro,我试过了,但代码似乎不起作用。我需要将列表中的每个文件与另一个文件进行比较,如果文件具有相同的内容,则删除该文件,并进行字符串比较。应删除较少的文件名。事实上并不是这个名字所伪装的:它提供了基于索引的快速访问以及快速的插入和删除。您可以只使用索引(如数组或
std::vector
)而不是摆弄迭代器。这并不是那么花哨,但很容易阅读和书写(对人类而言),并将使您的擦除问题易于处理。
bool is_same_contents(const QString & filenameA, const QString & filenameB);