我想从矢量中删除一个元素。例如:
// object that is in the vector: MyClass obj;
// vector looks as so: vector<MyClass*> pVector;
pVector.remove(obj);
答案 0 :(得分:3)
这将完全基于指针移除对象。理想情况下,您可以为MyClass
对象设置比较函数,实际检查对象以查看它们是否相同。
pVector.erase(std::remove(pVector.begin(), pVector.end(), obj), pVector.end());
答案 1 :(得分:1)
您的问题没有明确定义,但我会向您提供两个答案。我假设你的代码obj
是不是指针,这意味着我们正在将对象与指向对象的指针进行比较。这需要一个自定义函子。
第一个答案是如何删除向量的所有元素,其中指向元素的值等于obj
。这假定有一个operator==
可以应用于MyClass
个对象。
pVector.erase(std::remove_if(pVector.begin(), pVector.end(),
[&obj](MyClass * i) { return i && (*i == obj); }));
第二个将删除最多一个元素,如果找到:
auto e = std::find(pVector.begin(), pVector.end(),
[&obj](MyClass * i) { return i && (*i == obj); });
if (e != pVector.end()) {
pVector.erase(e);
}
lambda语法需要C ++ 11。如果您无法访问C ++ 11,则必须手动构建仿函数:
template <typename T>
class pointer_is_equal_to_object
{
public:
explicit pointer_is_equal_to_object(T const &);
bool operator()(T const *) const;
private:
T const & value;
}
template <typename T>
pointer_is_equal_to_object<T>::pointer_is_equal_to_object(T const & v) : value(v) {}
template <typename T>
bool pointer_is_equal_to_object<T>::operator()(T const * p) const
{
return p && (*p == value);
}
然后,例如,您可以使用:
pVector.erase(std::remove_if(pVector.begin(), pVector.end(),
pointer_is_equal_to_object<MyClass>(obj)));
请注意,如果您停止使用指针并仅使用std::vector<MyClass>
,则此复杂性会消失。然后您的operator==
可以直接应用,您可以这样做:
pVector.erase(std::remove(pVector.begin(), pVector.end(), obj));
答案 2 :(得分:0)
假设C ++ 11,并且您要删除与obj
匹配的任何元素,而不是确切的obj
...但您应该能够从这里找到它: )
http://en.wikipedia.org/wiki/Erase-remove_idiom
为了好玩,这是一个例子:http://ideone.com/6ILYvo
#include <algorithm>
#include <vector>
std::vector<MyClass*> v;
MyClass * toberemoved = new MyClass();
//v gets populated...
auto itr = std::remove_if(v.begin(),v.end(), [&](MyClass* a){return *a == *toberemoved;});
v.erase(itr,v.end());