您的问题没有明确定义,但我将为您提供两个答案。我在这里根据您的代码假设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));