C ++从向量中删除对象

时间:2014-12-04 23:23:20

标签: c++

我想从矢量中删除一个元素。例如:

// object that is in the vector: MyClass obj;
// vector looks as so: vector<MyClass*> pVector;

pVector.remove(obj);

3 个答案:

答案 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());