在 c++ 集中查找相等的实例

Find equal instance in a c++ set

本文关键字:实例 查找 c++ 集中      更新时间:2023-10-16

我正在使用 c++ STL 集,我想知道它是否存在于等效实例集中。为了检索实例,我正在使用查找集方法。问题是它不起作用。我认为问题出在我的比较器对象上:

bool SetComparator::operator ()( const Point* i1, const Point* i2 ) const {
    if ( *i1 == *i2 )
        return false;
    return true;
}

运算符 == 以简单的方式为类 Point 重新定义:

bool Point::operator ==( const Point& p ) const {
     if (x == p.x && y == p.y)
         return true;
     return false;
}

调试后,我可以看到 find 方法调用 operator(),但它没有找到相同的实例,因此 find 返回 end(),但我知道有一个相等的对象。我认为问题与设置的内部顺序有关。我该怎么办?

std::set 使用部分排序(即 operator< ),所以当你传入一个只能决定相等的运算符时,你就打破了 std::set 实现的假设。您的 SetComparator 必须表现得与 std::less 类似。

例如 std::p air(实用程序)为两个项目实现关系运算符,例如 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) 是仅使用operator<(rhs.first == lhs.first && lhs.second < rhs.second)解决方法

如果你只想检查相等性,也许使用 std::set 是错误的决定。如果可以对对象进行哈希处理,则可以使用 std::unordered_set(C++11 及更高版本)。