0

我正在制作一个生成迷宫的程序,然后使用 bredth first search 在迷宫中找到一条路。我的检查容器类中是否存在元素的函数现在使用这样的向量(其中坐标路径是向量的 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: 二进制 '<' : 'const Coordinate' 未定义此运算符或转换为预定义运算符可接受的类型 c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstddef 193

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

4

2 回答 2

2

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

因此,您需要添加以下运算符:

inline bool operator < (const Coordinate& first, const Coordinate& other);
于 2012-05-07T12:29:12.917 回答
1

要使用必须定义set的元素,或者您需要为容器提供比较函子。显然,您的类型没有这样做,或者您提供的参数不兼容。它应该大致如下所示:value_typeoperator<Coordinateoperator<

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;
于 2012-05-07T12:29:11.100 回答