2

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

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

2 回答 2

2

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

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

你是正确的,它erase 返回一个递增的迭代器,但我更喜欢在迭代器被擦除之前明确地这样做。

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

另请注意,Iter如果您没有在if.

于 2012-05-10T01:02:55.640 回答
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);
于 2012-05-10T01:20:53.190 回答