我想从向量中移除一个元素。例如:C++从向量中移除对象
// object that is in the vector: MyClass obj;
// vector looks as so: vector<MyClass*> pVector;
pVector.remove(obj);
我想从向量中移除一个元素。例如:C++从向量中移除对象
// object that is in the vector: MyClass obj;
// vector looks as so: vector<MyClass*> pVector;
pVector.remove(obj);
这将删除纯粹基于指针的对象。理想情况下,您可以使用MyClass
对象的比较函数,实际上会检查对象以查看它们是否相同。
pVector.erase(std::remove(pVector.begin(), pVector.end(), obj), pVector.end());
您的问题没有明确定义,但我会为您提供两个答案。我假设在这里根据您的代码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);
}
拉姆达语法要求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));
假设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());
'pVector.pop_back()'怎么样? – syntagma 2014-12-04 23:30:40
@ REACHUS不幸的是,它删除了最后一个元素!我想删除我作为参数传递的对象! – 2014-12-04 23:32:23
在回答了这个问题之后,看看我们有多少种方法可以做同样的事情...... :) – druckermanly 2014-12-04 23:37:48