2012-05-10 55 views
2

我正在初始化,並插入到一個列表,像這樣刪除並擦除一個iter?

_ARRAY_DETAIL* pAR = new _ARRAY_DETAIL; 
pAR->sVar1 = 1; 
pAR->nVar2 = 2; 
m_SomeList.push_back(pAR); 

我試圖找到幷包含值1的列表中刪除所有,然後刪除,我們用new創建的指針,是我的榜樣下面以一個好的,正確的高效方式進行操作?

while(Iter != m_SomeList.end()); 
{ 
    if((*Iter)->sVar1 == 1) 
    { 
     _ARRAY_DETAIL* pAR = *Iter; 
     Iter = m_SomeList.erase(Iter); 
     delete pAR; pAR = NULL; 
    } 

    Iter++; 
} 

回答

1

作爲替代方案,您可以使用remove if,儘管您所做的事情似乎很好。

bool IsOne (_ARRAY_DETAIL* pAR) { 
    if(pAR->sVar1 == 1) { 
    delete pAR; 
    return true; 
    } 
    return false; 
} 

remove_if (vec.begin(), vec.end(), IsOne); 
+0

'list :: remove_if'比自定義循環更好。儘管存儲原始指針會使這種用法複雜化。 –

2

一旦你清除了迭代器,它就不再有效。在擦除之前,您需要增加它。

if((*Iter)->sVar1 == 1) 
{ 
    _ARRAY_DETAIL* pAR = *Iter; 
    m_SomeList.erase(Iter++); 
    delete pAR; 
} 
else 
    ++Iter; 

你是正確的,erasereturns an incremented iterator但我更喜歡做明確的,迭代器被刪除之前。

將pAR設置爲NULL是多餘的,因爲它無論如何會超出下一行的範圍。

另請注意,如果您未在if的其他部分增加,則應該只增加Iter

+2

'擦除()'返回一個新的迭代器是在標準(§23.2.3/ 12) – Blastfurnace

+0

@Blastfurnace,謝謝 - 我將修改我的答案。 –

+0

「*您確信'erase'返回遞增的迭代器,但我更願意在迭代器被清除之前顯式執行它。*」這看起來確實很愚蠢 - 對於'std :: vector <>' ,那麼爲什麼不選擇一致性,並使用適用於_all_容器的方法? – ildjarn