C++ 删除和删除iter?

C++ 删除和删除iter?,c++,visual-c++,C++,Visual C++,我正在初始化并插入这样一个列表 _ARRAY_DETAIL* pAR = new _ARRAY_DETAIL; pAR->sVar1 = 1; pAR->nVar2 = 2; m_SomeList.push_back(pAR); 我正在尝试从包含值1的列表中查找并删除所有内容,然后删除我们使用新建创建的指针,下面的示例是否以正确有效的方式同时执行这两项操作 while(Iter != m_SomeList.end()); { if((*Iter)->sVar1 ==

我正在初始化并插入这样一个列表

_ARRAY_DETAIL* pAR = new _ARRAY_DETAIL;
pAR->sVar1 = 1;
pAR->nVar2 = 2;
m_SomeList.push_back(pAR);
我正在尝试从包含值1的列表中查找并删除所有内容,然后删除我们使用
新建
创建的指针,下面的示例是否以正确有效的方式同时执行这两项操作

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,则只应增加
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);

erase()
返回一个新的迭代器是标准(§23.2.3/12)“您认为
erase
返回一个递增的迭代器是正确的,但我更喜欢在迭代器被删除之前显式地执行它。”这似乎真的很愚蠢——同样的方法对
std::vector
不起作用,那么,为什么不选择一致性并使用适用于所有容器的方法呢?@ildjarn,我看到的是
std::vector::erase
。对于哪些方法返回迭代器以及哪些方法不返回迭代器的困惑让我更喜欢自己递增。
list::remove\u如果
比自定义循环更好的话。不过,原始指针的存储使这种用法复杂化。