2012-08-06 122 views
1

我有一个方法在类LinkRepository,我检查矢量数组中的重复项Datalinks,这是类的成员。我遍历数组中的所有元素以检查数组中已存在的新条目Datalink* datalink。如果是这样,那么不要添加,只需退出循环。C++打破向量循环

void LinkRepository::SaveLink(Datalink* datalink) { 
bool Exist = false; 

for(vector<Datalink*>::iterator dl = Datalinks.begin(); dl != Datalinks.end(); ++dl) 
{ 
    if((strstr((*dl)->ParentID, datalink->ParentID) != NULL) && (strstr((*dl)->ChildID,datalink->ChildID) != NULL)) 
    { 
      Exist = true; 

      dl = Datalinks.end(); 
    } 
} 

    if(!Exist) 
    { 
     Datalinks.push_back(datalink); 
    } 
}; 

我的程序似乎崩溃的声明dl = Datalinks.end();

我不知道它为什么崩溃的下一个循环?

+1

如果你不想重复,你确定'std :: vector'是正确的选择吗?还有其他的数据结构可以更有效地防止重复,比如'std :: set'和'std :: unordered_set'。 – fredoverflow 2012-08-06 12:05:35

+0

@FredOverflow你可能有我可以看看哪些是最好的使用来源?我选择'std :: vector'是因为我想要一个动态数组,因为我必须查看'Datalink'对象中'ParentID'和'ChildID'的成员。不用它'std :: set1'或'std :: unordered_set'可以为我做这个吗? – ZioN 2012-08-06 12:29:58

回答

8

更换

dl = Datalinks.end(); 

有了:

break; 

退出循环

下面是一个简单的例子来说明为什么你的解决方案不能工作:

int i = 0; 
for (; i != 10; ++i) 
{ 
    i = 10; 
} 

这个循环会永远不会结束,因为我会比较i != 10

+1

您也可以将'dl = Datalinks.end();'改为'dl = Datalinks.rbegin();'。这会在'end'之前将'dl'设置为1,所以增量会使它等于'end'。另一种方法是将测试从'dl!= Datalinks.end()'改为'dl> = Datalinks.end()'。有很多方法可以解决它,但“休息”可能是最好的。 – 2012-08-06 12:10:37

+0

@Andrew这是做的伎俩,你的例子很好地解释了为什么它不工作,谢谢。 – ZioN 2012-08-06 12:10:52

+1

@DavidSchwartz:当反向迭代器与[forward-]迭代器不具有相同的类型时,这会中断,并且真正依赖于容器的实现细节而不是其抽象。 – 2012-08-06 12:43:40

4

它崩溃,因为首先你的迭代器设置为Datalinks.end()然后,在离开这个迭代之前递增至11日,for循环本身递增迭代器,使操作无效。

0
for(vector<Datalink*>::iterator dl = Datalinks.begin(); dl != Datalinks.end() && !Exist; ++dl) 
{ 
    if((strstr((*dl)->ParentID, datalink->ParentID) != NULL) && (strstr((*dl)->ChildID,datalink->ChildID) != NULL)) 
    { 
      Exist = true; 
    } 
} 

就像大家都说过你在迭代一个。因此,它将进入不需要的内存位置,最终导致seg故障。你必须认识到++ dl正在循环结束时发生。

另外,在这里使用break语句是荒谬的。你已经有一个布尔,利用它。

+0

感谢您的替代想法,只是一个问题?为什么哟看到这里的突破声明是荒谬的? – ZioN 2012-08-08 05:38:21