2014-04-22 123 views
2

爲什麼下面不工作?:C++向量的std :: find()方法與自定義類的矢量

MyClass *c = new MyClass(); 
std::vector<MyClass> myVector; 
std::find(myVector.begin(), myVector.end(), *c) 

這會帶來一個錯誤。我不記得確切的錯誤,對不起,但它說像MyClass和const MyClass無法與運算符進行比較==

但是,如果我使用非類數據類型而不是「MyClass」 ,一切正常。 那麼如何用類正確地做到這一點?

+3

您是否爲您的班級重載'operator =='? – yizzlez

+0

不,我沒有,那實際上是問題,謝謝! – user3453494

回答

0

除非您重載了operator ==來提供這樣的函數,否則不能比較自己的類類型的兩個對象。 std :: find()使用你的重載運算符==來比較你默認提供的迭代器範圍內的對象。從http://www.cplusplus.com/reference/algorithm/find/std::find

+2

@CaptainObvlious:'operator =='永遠不會爲類類型隱式定義/自動生成。 – aschepler

+1

如果它至少被隱式定義,至少對於POD來說將會很好。缺少它意味着使用memset-memcmp來比較結構是很誘人的。 –

+0

糟糕。出於某種原因,我認爲這是一個複製作業操作員 –

7

文檔:在範圍

template <class InputIterator, class T> InputIterator find (InputIterator first, InputIterator last, const T& val);

查找值,則返回在其比較等於VAL範圍[第一,最後一個)的迭代器到所述第一元件。如果沒有找到這樣的元素,該函數最後返回。

該功能使用operator==將各個元素與val進行比較。

編譯器不會爲類生成默認的operator==。您必須定義它以便能夠使用std::find以及包含您班級實例的容器。

class A 
{ 
    int a; 
}; 

class B 
{ 
    bool operator==(const& rhs) const { return this->b == rhs.b;} 
    int b; 
}; 

void foo() 
{ 
    std::vector<A> aList; 
    A a; 
    std::find(aList.begin(), aList.end(), a); // NOT OK. A::operator== does not exist. 

    std::vector<B> bList; 
    B b; 
    std::find(bList.begin(), bList.end(), b); // OK. B::operator== exists. 
} 
+0

謝謝你的回答!這對我來說很有意義! – user3453494