我对STL不是很了解,我看到很少的帖子与我的要求类似并且感到困惑.所以,我需要一些关于以下代码的建议.
SomeStruct someStruct(identifier);
std::vector<SomeStruct*>::iterator it = std::find_if(vWrapper.begin(), vWrapper.end(), SomeStruct::Find_SomeStruct(&someStruct));
if(it != vWrapper.end())
{
...
delete *it;
it = vWrapper.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
我试图基于标识符查看向量,然后删除指向存储在向量中的对象的指针.
我看到了帖子.它使用for循环并重新分配迭代器.此外,没有帖子使用find_if()然后删除和擦除.
我是以正确的方式做到的吗?
在形式上,你所做的是未定义的行为,但实际上,它很好.发生未定义的行为是因为
std::vector要求所有内容在任何时候都是可复制和可分配的,并且delete使得传递的指针值无效,因此不可复制.实际上:std::vector如果你之后立即删除指针值,它不会复制指针值,而且我不知道今天的机器在没有风险的情况下无法真正复制删除的指针值.(只是不要取消引用它.)如果你真的想避免未定义的行为,你可以这样做:
SomeStruct* tmp = *it;
it = vWrapper.erase(it);
delete tmp;
Run Code Online (Sandbox Code Playgroud)
但坦率地说,我不确定这是值得的.