2010-07-07 35 views
0

我試圖從一個向量中移除一個元素。C++:從一個向量中移除項目時的困難

vector<Foo> vecFoo; 

Foo f1; 
Foo f2; 
Foo f3; 

vecFoo.push_back(f1); 
vecFoo.push_back(f2); 
vecFoo.push_back(f3); 

Foo* pF1 = &f1; 

vecFoo.erase(std::remove(vecFoo.begin(), vecFoo.end(), *pF1), vecFoo.end()); 

最後一行產生大量的C2784錯誤。我究竟做錯了什麼?

(是的,這個例子是有點做作,但實質是,我有一個指向向量的元素,我想刪除該元素。)

回答

2

您是否缺少比較運算符?

class Foo 
{ 
    public: 
     bool operator==(Foo const& rhs) const { return true;} 

     ... Other stuff 
}; 
0

你沒有指向元素的指針,因爲push_back生成一個副本。你可以使用Foo* pF1 = &vecFoo[0];

假設這只是一個錯字,你可以非常簡單地得到一個元素的迭代器,因爲向量迭代器是隨機訪問的。

vector<Foo>::iterator i = vecFoo.begin() + (pF1 - &vecFoo.front()); 
+0

也許我錯過了一些東西,但只要Foo有一個比較運算符,你可以很好地比較f1(或者OP的例子中的* pF1)和它的實際存儲在std :: vector中的副本... – 2010-07-07 19:47:17

+0

@Eugen,不,你不會錯過任何東西,我對這個問題的結構有點困惑。我很想刪除這個答案,但我仍然認爲它可能有用;我對現實問題還不夠了解。 – 2010-07-07 20:05:45

0

你超負荷Foooperator==

Foo有一個非平凡的析構函數,賦值運算符或複製構造函數,但不是全部三個?如果你定義一個,你必須全部定義它們。

即使您沒有重載析構函數,賦值運算符或複製構造函數,其中一個Foo的成員也已聲明爲它的析構函數或賦值運算符或複製構造函數。