2012-05-07 3 views
0

Я делаю программу, которая создает лабиринт, а затем использует первый поиск бредта, чтобы найти способ в лабиринте. Моя функция, которая проверяет, является ли элемент присутствует в контейнере классе теперь использует вектор как это (где coordinatePath является ЬурейиМ для вектора):Как я могу создать функцию, которая находит объект в наборе?

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()); 
} 

, когда я пытаюсь recomplie я получаю много ошибок, где верхний является

Ошибка 22 Ошибка C2676: двоичный '<': 'const Coordinate' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора c: \ program files (x86) \ microsoft visual studio 11.0 \ vc \ include \ xstddef 193

Я действительно не понимаю эти особые отладочные сообщения и задаюсь вопросом, есть ли способ реализовать этот быстрый поиск!

ответ

1

Для использования элементов в setvalue_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; 
+0

@MSalters Что с свободной 'оператора <'? – pmr

+0

Большое спасибо за быстрый ответ! – Mattias

+0

@pmr: 'Координата (0,0) <Координата (0,0)' была 'истина', которая нарушала требование строгого слабого порядка. В общем, все координаты были неравными даже для самих себя. Я изменил его, так что все координаты равны, что действительно. – MSalters

2

Для того, чтобы создать std::set объектов, эти объекты должны определить operator <.

Так что вам нужно добавить следующий оператор:

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

Хороший ответ. Но было бы неплохо сказать, что должен быть определен не только 'operator <()', но также и то, что он должен быть реализован с согласованностью и обеспечить строгое строгое упорядочение **. – ereOn

+0

Большое спасибо за быстрый ответ! – Mattias

Смежные вопросы