删除并擦除迭代器

delete and erasing an iter?

本文关键字:迭代器 擦除 删除      更新时间:2023-10-16

我正在初始化并插入到这样的列表中

_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++;
}

擦除迭代器后,它不再有效。您需要在擦除之前递增它。

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

您是正确的,erase返回一个递增的迭代器,但我更喜欢在擦除迭代器之前显式执行此操作。

将 pAR 设置为 NULL 是多余的,因为无论如何它都会超出下一行的范围。

另请注意,只有在if的其他部分中未递增Iter,才应递增。

作为

替代方案,您可以使用remove if尽管您所做的似乎很好。

 bool IsOne (_ARRAY_DETAIL* pAR) { 
   if(pAR->sVar1 == 1) {
    delete pAR;
    return true;
   }
   return false;
 }
 remove_if (vec.begin(), vec.end(), IsOne);