我使用的是c ++ STL集,我想知道它在集合中是否存在等效实例。要使用find set方法检索实例,请执行此操作。问题是它不起作用。我认为问题出在我的比较器对象中:
bool SetComparator::operator ()( const Point* i1, const Point* i2 ) const {
if ( *i1 == *i2 )
return false;
return true;
}
以一种简单的方式为类Point重新定义operator ==:
bool Point::operator ==( const Point& p ) const {
if (x == p.x && y == p.y)
return true;
return false;
}
调试后我可以看到find方法调用了operator(),但它找不到相同的实例,所以find返回end(),但我知道有一个相等的对象。我认为问题与设定的内部订单有关。我该怎么办?
答案 0 :(得分:5)
std :: set使用部分排序(即operator<
),所以当你传入一个只能决定相等的运算符时,你就打破了std :: set实现的假设。您的SetComparator必须与std::less
类似。
例如,std :: pair(实用程序)对两个项目实现relational operators,例如operator<
:
template <class T1, class T2>
bool operator< (const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs) {
return lhs.first<rhs.first || (!(rhs.first<lhs.first) && lhs.second<rhs.second);
}
请注意,(!(rhs.first<lhs.first) && lhs.second<rhs.second)
是(rhs.first == lhs.first && lhs.second < rhs.second)
仅使用operator<
如果您只想检查相等性,可能使用std :: set是错误的决定。如果您可以散列对象,则可以使用std::unordered_set(C ++ 11及更高版本)。