我有这个:
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());
是的,我知道我只是胡说八道,但对你而言,这是有道理的。在某个地方应该有一个像这样的简单解决方案,我只是想要那个。
答案 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里面有一个引用计数器。如果对象未被任何变量引用,则将自动删除。