C++ 按名称查找重复项时出错

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

我已经写了一个程序,可以按名称查找重复项。 例如:假设我们在不同的目录中有文件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;
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;
    }