2011-05-16 102 views
0

爲什麼下面的代碼失敗?擦除程序中的矢量元素

typedef vector<SOCKET /*socket*/> UIConnection; 

UIConnection::iterator itrUICon; 

for (itrUICon = m_ListUIConnection.begin();itrUICon != m_ListUIConnection.end();itrUICon++) 
{ 
    if (*itrUICon == nSock) 
    {   
     itrUICon = m_ListUIConnection.erase(itrUICon);   
    } 
} 

回答

4

可能是因爲你刪除Vector中的最後一個項目,然後在for語句的增量部分增量itrUICon的時候已經是等於.end()

首選使用erase()/std::remove()慣用語,或者至少將增量移出for語句,並且僅在您執行erase時才執行。

+0

查爾斯將這個工作映射爲well.typedef map GatewayConnection; – 2011-05-16 07:01:31

+0

@Chris_vr:對於'std :: remove'對於關聯容器不起作用,因爲它們保持順序。你可以做'mp.erase(it ++);'而不是因爲擦除地圖中的元素不會使除指向被刪除元素的迭代器以外的任何迭代器失效。 – 2011-05-16 07:31:13

6

您必須刪除for指令中的++itrUICon

UIConnection::iterator itrUICon; 

for (itrUICon = m_ListUIConnection.begin();itrUICon != m_ListUIConnection.end();) 
{ 
    if (*itrUICon == nSock) 
    {   
     itrUICon = m_ListUIConnection.erase(itrUICon);   
    } 
    else ++itrUICon; 
} 
+0

當然,對!我記得最後一個項目中的一個。 – Xeo 2011-05-16 06:46:54

+0

爲什麼downvote? – Simone 2011-05-16 06:49:06

+0

@Simone:可能是隨機駕駛。我幾乎與你的同一時間收到了一份。 – 2011-05-16 06:51:03