给定指向对象的指针,我试图从unique_ptrs
列表中删除相同的对象。我这样做是通过匹配较大list
列表的原始指针unique_ptr
子集的每个元素来实现的,该列表肯定包含子集list
中的所有元素。代码:
编辑:为清楚起见,rawListSubset为std::list<MyObj>
和smartListSet是std::list< unique_ptr<MyObj> >
。
for (auto& deleteThis : rawListSubset)
{
// Find the matching unique_ptr
for (auto& smartPtrElement : smartListSet)
{
if (deleteThis == smartPtrElement.get())
{
unique_ptr<Entity> local = move(smartPtrElement);
// Hence deleting the object when out of scope of this conditional
}
}
}
或者,这不起作用,但它提出了我正在尝试做的事情。
for (auto& deleteThis : rawListSubset)
{
// Find the matching unique_ptr
for (auto& smartPtrElement : smartListSet)
{
if (deleteThis == smartPtrElement.get())
{
smartListSet.remove(smartPtrElement);
// After this, the API tries to erroneously copy the unique_ptr
}
}
}
如何删除指针指向的对象,并将其从列表中安全删除?
答案 0 :(得分:3)
要从循环中的std::list
安全地删除元素,必须使用迭代器。 std::list::erase()
删除迭代器指定的元素,并将迭代器返回到列表中的下一个元素:
for (auto& deleteThis : rawListSubset)
{
// Find the matching unique_ptr
auto i = smartListSet.begin();
auto e = smartListSet.end();
while (i != e)
{
if (deleteThis == i->get())
i = smartListSet.erase(i);
else
++i;
}
}
答案 1 :(得分:1)
您可以通过使用迭代器迭代列表来删除元素,而不是使用范围循环:
for (auto& deleteThis : rawListSubset)
{
// Find the matching unique_ptr
for (auto smartPtrIter = smartListSet.begin(); smartPtrIter != smartListSet.end(); )
{
if (deleteThis == smartPtrIter->get())
{
smartListSet.erase(smartPtrIter++);
} else
++smartPtrIter;
}
}
当您从列表中删除该元素时,智能指针指向的对象将被删除,即智能指针的用途。