2014-12-04 82 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());