删除并擦除迭代器
delete and erasing an 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++;
}
擦除迭代器后,它不再有效。您需要在擦除之前递增它。
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);
相关文章:
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 如何使用 std::list 模板的迭代器擦除
- 迭代时擦除设置元素///
- 如何从TBB concurrent_hash_map C++迭代和擦除
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- 迭代器擦除矢量中的元素无效,但它不会崩溃
- C 列表迭代和擦除
- 无法使用迭代器擦除矢量元素,矢量元素实现移动构造函数
- 映射::擦除:按键擦除或迭代器擦除之间的区别
- 在C++STL映射上通过迭代器擦除
- 使用迭代器擦除矢量中的元素
- STL 允许使用指向不同映射的迭代器擦除映射的键/值?
- std::forward_list -- 使用存储的迭代器擦除
- 映射迭代器擦除未调用适当的析构函数
- 迭代器擦除 (迭代器在先,迭代器最后) 在 Visual C++ 2010 Express 下不起作用
- Boost multi_index反向迭代器擦除麻烦
- 使用迭代器擦除'find'或'remove'
- 列表迭代器擦除"Debug assertion failed"
- std:使用迭代器擦除元素时:d内存损坏
- 向量迭代器擦除给我一个运行时错误