1

什么是实现自定义 find() 函数的干净方法?例如,我希望我的 operator== 为类 X 工作,匹配接近现有值的变量值。

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 
4

2 回答 2

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();
于 2012-07-07T21:28:56.343 回答
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 算法提供自定义比较器,请参阅其他答案。

于 2012-07-07T21:34:19.403 回答