C++ 按名称查找重复项时出错
我已经写了一个程序,可以按名称查找重复项。 例如:假设我们在不同的目录中有文件a.txt、b.txt、c.txt。我需要找到仅按名称复制的文件。输出将是存在于不同目录中的文件名 代码:C++ 按名称查找重复项时出错,c++,duplicates,C++,Duplicates,我已经写了一个程序,可以按名称查找重复项。 例如:假设我们在不同的目录中有文件a.txt、b.txt、c.txt。我需要找到仅按名称复制的文件。输出将是存在于不同目录中的文件名 代码: fs::路径临时持有者; int isDuplicate=0//检查是否重复。 常量迭代器tembit(v.begin())//我已经有了vector v,它包含了所有的文件名 for(vec::const_迭代器it(v.begin());it!=v.end();) { tempHolder=*it; isDu
fs::路径临时持有者;
int isDuplicate=0//检查是否重复。
常量迭代器tembit(v.begin())//我已经有了vector v,它包含了所有的文件名
for(vec::const_迭代器it(v.begin());it!=v.end();)
{
tempHolder=*it;
isDuplicate=0;
tempit=it;
而((++tempit)!=v.end()&&tempHolder==(*(++it)))
{
isDuplicate=1;
}
如果(isDuplicate==1)
{
cout这个循环对我来说似乎很奇怪:
tempit=it;
while((++tempit)!=v.end() && tempHolder==(*(++it)))
{
isDuplicate=1;
}
如果it
是容器的最后一个有效迭代器,则第一个条件将为false,因此短路求值将导致++it
永远无法执行。循环将无限期运行
while((++tempit)!=v.end() && tempHolder==*tempit)
应该有用
while((++tempit)!=v.end() && tempHolder==(*(++it)))
您可以操纵在大循环(it)中使用的迭代器
更好:
如果我正确理解你的代码
编辑:您的it
需要在第一个循环中递增
我个人更愿意这样写:
while ((++tempit)!= v.end())
if (*tempit = *it)
{
duplicate = true;
break;
}
我有以下文件夹结构:duplicate[folder]=dup1[folder]+a.txt+b.txt+e.txt;dup1[folder]=dup2[folder]+a.txt+b.txt+c.txt+d.txt+e.txt;dup2[folder]=b.txt+c.txt。如果我按照你的代码做,我将得到以下输出=a.txt,b.txt,b.txt,c.txt,e.txt。但是我需要以下输出=a.txt,b.txt,c.txt,e.txt谢谢。但是我还需要有多少文件是重复的。这就是为什么我没有中断循环。好的,然后不要中断并增加重复的变量。duplicate++;
我有以下内容文件夹结构:duplicate[folder]=dup1[folder]+a.txt+b.txt+e.txt;dup1[folder]=dup2[fol]der]+a.txt+b.txt+c.txt+d.txt+e.txt;dup2[文件夹]=b.txt+c.txt。如果我按照你的代码做,我会得到以下输出=a.txt,b.txt,b.txt,c.txt,e.txt。但是我需要以下输出=a.txt,b.txt,c.txt,e.txt。如果我理解你的意思是正确的,你希望一个副本只显示一次。所以如果有b.txt,b.txt和b.txt,你希望在你的副本列表中只显示一次。对吗?然后使用std::set duplicates
。如果发现重复项,请插入。完成后,只需在集合上迭代并打印出来。std::set
只保存一个不同的项。因此,如果插入“a”两次,集合只保存“a”一次。
while((++tempit)!=v.end() && tempHolder==(*tempit))
while ((++tempit)!= v.end())
if (*tempit = *it)
{
duplicate = true;
break;
}