实现自定义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 :(得分: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算法提供自定义比较器,请参阅另一个答案。