2015-07-21 3 views
1

Я пишу алгоритм C++ для решения настольной игры. Решение основано на следующем:std :: set с непоследовательным оператором <

enqueue initial board 
while queue not empty: 
    dequeue a board 
    if board is solved: 
     print solution 
    else: 
     for each possible board that can arise out of this one: 
      add board to end of queue 

Поскольку я не хочу, чтобы изучить ту же доску более чем один раз, я использую std::set<Board> следить за рассмотренных плат.

В Board класс bool operator<(const Board& rhs) const предназначен для правильной работы std::set.

Итак, что происходит в моем std::set, если моя функция сравнения не гарантирует порядок в экземплярах платы?

В качестве примера:

a = Board() 
b = Board() 
c = Board() 

a > b returns true 
b > c returns true 
a > c returns false 

Возможно ли, что std::set, так как он основан на Красно-черное дерево, вставляет тот же совет несколько раз?

+0

if 'operator <' не работает как правильный компаратор - поведение контейнера не определено и специфично для реализации – Hcorg

+1

Поскольку программа не определена, все может произойти. – molbdnilo

+0

Чтобы добавить к сказанному, если вы используете Visual C++, время выполнения отладки проверяет это и будет терпеть неудачу с помощью assert(), если вы сделали что-то похожее на то, что вы опубликовали. Итак, для среды выполнения отладки Visual C++ поведение «четко определено» - ваша программа будет 'assert()' и выйти. – PaulMcKenzie

ответ

1

Если компаратор не работает должным образом, структура не будет работать должным образом. Он может сообщить, что элементы отсутствуют. Это может не вставить что-то. Он может быстро сработать, или он может работать для всех ваших тестовых случаев, а затем сбой на машине клиента.

Все ставки отключены.

+0

нужно подумать о хорошем способе сравнить доски! –

+0

Можете ли вы сериализовать платы, т. Е. Превратить их в строку или последовательность байтов? Если это так, вы можете сравнить сериализованные представления. (Это требует уникальной сериализации, т. Е. Если конкретная сериализация зависит от истории движений, тогда две «идентичные» платы могут быть неравными. C++ не делает предположений здесь) – MSalters

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

  • Нет связанных вопросов^_^