2014-12-04 54 views
-2

我想从向量中移除一个元素。例如:C++从向量中移除对象

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

pVector.remove(obj); 
+1

'pVector.pop_back()'怎么样? – syntagma 2014-12-04 23:30:40

+0

@ REACHUS不幸的是,它删除了最后一个元素!我想删除我作为参数传递的对象! – 2014-12-04 23:32:23

+0

在回答了这个问题之后,看看我们有多少种方法可以做同样的事情...... :) – druckermanly 2014-12-04 23:37:48

回答

1

这将删除纯粹基于指针的对象。理想情况下,您可以使用MyClass对象的比较函数,实际上会检查对象以查看它们是否相同。

pVector.erase(std::remove(pVector.begin(), pVector.end(), obj), pVector.end()); 
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); 
} 

拉姆达语法要求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)); 
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());