C++ 如何通过比较其他成员从QStringList中删除元素
我有一个QStringList代码,其中包含一些文件名 我需要比较每个文件的内容,并删除文件名,如果它有相同的内容。我需要删除具有相同内容的文件名,文件名升序较大 假设有5个文件名为 测试1 测试2 测试3 测试4 测试5 首先,我将比较测试1和测试2的文件内容,如果内容匹配从列表中删除测试1,比较测试2和测试3的内容,如果内容不匹配,则将do+1与迭代进行比较,并比较测试3和测试4的内容,如果内容匹配,则删除测试3,然后删除测试2和测试4 我如何使用迭代器呢。我非常害怕使用erase使迭代器无效。正如@Scheff提到的,我认为您可以直接使用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::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);