如何用指针擦除矢量元素

How to erase vector element by pointer?

本文关键字:元素 擦除 何用 指针      更新时间:2023-10-16

我有这个:

vector<Object*> myVec;

并像这样添加我的对象:

Object *obj1 = new Object;
myVec.push_back(obj1);

让我们假设我有100个这样的对象,指针是*obj1,*obj2*obj100.
现在我想从向量中去掉obj37。我希望我能像推动它一样做到这一点:

myVec.remove_back(obj37);

如果有一个像"remove_back"这样的函数,那就太棒了,但我认为没有。我希望你明白了,请帮帮我。

顺便说一句,看看这个问题,在公认的答案中,有一个按值工作的移除算法:

vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());

我投了一个有指针的球,即使我不相信这会奏效,也会让人感到惊讶;它没有:

myVec.erase(std::remove(myVec.begin(), myVec.end(), *obj37), vec.end());

是的,我知道我只是胡说八道,但这是给你的,明白了。某个地方应该有一个像这样的简单解决方案,我只想要它。

您几乎做到了:按值搜索元素

myVec.erase(std::remove(myVec.begin(), myVec.end(), obj37), myvec.end());
//                                                  ^^^^^

或者,如果你知道元素在位置36(基于0),你可以直接擦除它:

myvec.erase(myvec.begin() + 36);

或者,在现代C++中:

myvec.erase(next(begin(myvec), + 36));

还要注意,std::remove搜索整个向量,因此如果您知道只有一个元素,则可以使用find在找到值后立即停止:

{
    auto it = std::find(myVec.begin(), myVec.end(), obj37);
    if (it != myVec.end()) { myVec.erase(it); }
}

std::remove()"删除"与最后一个参数匹配的值。也就是说,你可以这样删除你的指针:

myVec.erase(std::remove(myVec.begin(), myVec.end(), ptr), myVec.end());

如果只有一个元素匹配,则使用std::find()而不是std::remove()可能更容易。如果你真的想匹配指向的值,你可以使用_if版本的算法和一个合适的谓词。当然,删除指针不会释放任何内存。

如果使用C++11,可以将智能指针放入向量中。然后你可以使用擦除方法删除对象,智能指针自动处理删除指针的内容。

vector<std::shared_ptr<Object>> myVec;

shared_ptr内部有一个引用组。如果对象没有被任何变量引用,它将被自动删除。