find()相等运算符重载

时间:2012-07-07 21:15:15

标签: c++

实现自定义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 

2 个答案:

答案 0 :(得分:1)

您的find函数会比较指针而不是数据。如果你有一个兼容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();

答案 1 :(得分: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 Library ptr_vector作为向量,为指针容器提供更清晰的界面,或者

  • 为STL算法提供自定义比较器,请参阅另一个答案。