如何创建一个在集合中查找对象的函数?

时间:2012-05-07 12:26:58

标签: c++

我正在创建一个生成迷宫的程序,然后使用bredth first search在迷宫中找到一种方法。检查容器类中是否存在元素的函数现在使用这样的向量(其中coordinatePath是vector的typedef):

bool Labyrinth::inVisited(const Coordinate &c, const coordinatePath &visited ) const
{
    for each (Coordinate coord in visited)
    {
        if(coord == c)
            return true;
    }
    return false;
}

由于如果元素不存在,此方法必须遍历整个容器,因此对于大型搜索非常无效。我试图实现使用集合而不是向量的相同函数,并按如下方式编写它:

bool Labyrinth::inVisited(const Coordinate &c, const set<Coordinate> &visited ) const
{
       return (visited.find(c) != visited.end());
}

当我试图重复时,我得到了很多错误,其中最顶层是

错误22错误C2676:二进制'&lt;' :'const Coordinate'未定义此运算符或转换为预定义运算符可接受的类型c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xstddef 193

我真的不了解这些特定的调试消息,并想知道是否有办法实现这种更快的搜索!

2 个答案:

答案 0 :(得分:2)

为了创建std::set个对象,这些对象必须定义operator <

所以你需要添加以下运算符:

inline bool operator < (const Coordinate& first, const Coordinate& other);

答案 1 :(得分:1)

要使用set value_type中的元素,operator<必须定义Coordinate,或者您需要为容器提供比较仿函数。显然,您的operator<类型不会这样做,或者您提供的struct Coordinate { bool operator<(const Coordinate& other) const { return false; } }; // or by providing a functor struct CmpCoord { bool operator()(const Coordinate& x, const Coordinate& y); }; typedef std::set<Coordinate, CmpCoord> coord_set; 采用不兼容的参数。看起来应该大致如下:

{{1}}