如何通过指针擦除向量元素?

时间:2014-10-25 21:59:23

标签: c++ pointers vector

我有这个:

vector<Object*> myVec;

并将我的对象添加到其中:

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

假设我以这种方式拥有100个对象,指针为* obj1,* obj2 ... * obj100。
现在我想从矢量中删除让我们说的obj37。我希望我能像推动它那样做:

myVec.remove_back(obj37);

如果有像&#34; remove_back&#34;这样的功能,那将是很棒的。但我想不到。 我希望你明白这一点,请帮助我。

顺便说一句,看看这个question,在接受的答案中,删除算法按值运行:

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

我用指针给了它一个镜头,即使我不相信这会起作用和惊喜;它没有:

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

是的,我知道我只是胡说八道,但对你而言,这是有道理的。在某个地方应该有一个像这样的简单解决方案,我只是想要那个。

3 个答案:

答案 0 :(得分:9)

你几乎就在那里:按值搜索元素

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); }
}

答案 1 :(得分:1)

std::remove()“删除”与最后一个参数匹配的值。也就是说,您可以删除指针,如下所示:

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

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

答案 2 :(得分:0)

如果使用C ++ 11,可以将智能指针放入向量中。你可以使用erase-method删除对象,并自动智能指针处理删除指针的东西。

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

shared_ptr里面有一个引用计数器。如果对象未被任何变量引用,则将自动删除。