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 に答える