我正在创建一个生成迷宫的程序,然后使用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
我真的不了解这些特定的调试消息,并想知道是否有办法实现这种更快的搜索!
答案 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}}