2012-07-07 74 views
1

什麼是實現自定義find()函數的乾淨方式?例如,我想讓我的operator ==爲類X找到工作,匹配與現有值接近的變量的值。find()相等運算符過載

class X{ 
public: 


    double _a; 
    double _b; 
    double _c; 

X(double a, double b, double c){ 
    _a = a; 
    _b = b; 
    _c = c; 
} 

    bool operator==(const X& other) const 
    { 
     if(fabs(other._a - _a) < 0.02) return true;  
     return false; 
    } 


}; 

typedef X* ptrX; 

std::vector<ptrX> vec; 
ptrX t1 = new X(1,2,3); 
vec.push_back(t1); 
ptrX t = new X(1.01,2,3); 

bool b = (find(vec.begin(),vec.end(),t) == vec.end()); //b should be false 
+0

_Why_你爲什麼使用指針?這個問題完全不需要 – 2012-07-07 21:25:27

+0

另外,[該函數已經存在,在線演示實現](http://www.cplusplus.com/reference/algorithm/find/) – 2012-07-07 21:26:35

+0

除了它會被混淆的事實因爲你使用的是指針而不是值 – 2012-07-07 21:27:37

回答

1

您的查找函數比較指針而不是數據。如果你有一個C++ 11兼容的編譯器,則應該是能夠做到這一點:

bool b = std::find_if(vec.begin(), vec.end(), 
    [&](const ptrX& p){ return *t == *p; } 
) == vec.end(); 

或者在非C++ 11環境:

bool b = std::find_if(vec.begin(), vec.end(), your_deref_equal) == vec.end(); 
+0

謝謝! – Raghu 2012-07-07 22:04:30

0

你平等的運營商好(除了它不是等價的,但你想這樣)。然而,你的問題是你存儲的是指針,而不是矢量中的對象,因此你完全不使用比較運算符(如果有的話,比較指針是否相等,find)。

您可以通過

  • 直接在矢量存儲的對象,那就是你的代碼段改爲

    std::vector<X> vec; 
    X t1 = X(1,2,3); 
    vec.push_back(t1); 
    X t = X(1.01,2,3); 
    bool b = (find(vec.begin(),vec.end(),t) == vec.end()) 
    

    ,這將是很容易解決這個問題,並會工作,但不會在某些情況下可以接受(如果您希望相同的對象在矢量中是兩次)。在這種情況下,你可以

  • 使用Boost Ponter Container Libraryptr_vector作爲載體,這爲指針的容器提供更清晰的界面,或者

  • 提供自定義比較STL的算法,見對方的回答。

+0

[編譯正常](http://ideone.com/dyV8i)(雖然不應該,因爲他沒有資格'發現'...) – 2012-07-07 21:36:18

+1

@MooingDuck:啊,是的,我忽略了這樣的事實, '也是一個指針。關於非資格,我相信他很幸運,Koenig從迭代器的類型中找到了'find'。 – jpalecek 2012-07-07 21:44:40

+0

啊對,Koening查找,沒想到那個。 – 2012-07-08 17:02:24