我想從向量中移除一個元素。例如: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