按名称查找重复项时出错

时间:2014-02-13 12:18:01

标签: c++ duplicates

我写了一个程序,可以按名称查找副本。 例如:假设我们在各种目录中都有文件a.txt,b.txt,c.txt。我需要查找仅按名称复制的文件。输出将是各种目录中的文件名。< / p>

代码:

fs::path tempHolder;
int isDuplicate=0;//To check whether duplicate or not.
vec::const_iterator tempit (v.begin());//i already have vector v which has all the filenames
for (vec::const_iterator it (v.begin()); it != v.end();)
{

   tempHolder=*it;
   isDuplicate=0;
   tempit=it;
   while((++tempit)!=v.end() && tempHolder==(*(++it)))
   {
      isDuplicate=1;
   }
   if(isDuplicate==1)
   {
      cout<<"Duplicate:"<<tempHolder<<endl;
   }
 }

问题是for循环是递归的,但是它正确打印了重复的文件名。谢谢。

2 个答案:

答案 0 :(得分:0)

这个循环对我来说很奇怪:

tempit=it;
while((++tempit)!=v.end() && tempHolder==(*(++it)))
{
    isDuplicate=1;
}

如果it是容器的最后一个有效迭代器,则第一个条件将为false,因此短路评估将导致永远不会执行++it。循环将无限期地运行。

while((++tempit)!=v.end() && tempHolder==*tempit)

应该有用。

答案 1 :(得分:0)

while((++tempit)!=v.end() && tempHolder==(*(++it)))

你操纵你在大循环(it)中使用的迭代器 更好:

while((++tempit)!=v.end() && tempHolder==(*tempit))

如果我正确理解您的代码。

编辑:您的it需要在第一个循环中递增。

我个人宁愿写这样的东西:

while ((++tempit)!= v.end())
    if (*tempit = *it)
    {
        duplicate = true;
        break;
    }