2012-08-06 111 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