Логи вашего оператора c не работает (не удовлетворяет строгим требованиям слабого заказа). В последнем предложении также требуется lhs.z == rhs.z
. В противном случае lhs.z
может быть > rhs.z
, но вы все равно получите положительный результат, что приведет к несогласованному упорядочиванию.
Алгоритмы стандартной библиотеки возлагают на вас бремя ответственности, чтобы сделать это правильно, и нарушение полученных предположений может легко приводят к хаосу (читай: неопределенному поведению), например к ошибкам сегментации.
Представьте себе комментарий внутри реализации, говорящий что-то вроде «на данный момент мы знаем, что a
меньше b
, поэтому мы не нужно выполнять проверку диапазона / границ на b
". Когда a
неожиданно больше , чем b
, отсутствие проверки границ может вызвать плохой доступ к памяти. Результат, однако, может быть гораздо более тонким и вызывать странные ошибки в дальнейшем, поэтому важно делать все правильно.
Вы могли бы sh рассмотреть возможность использования более короткого и менее подверженного ошибкам метода реализации. этот порядок:
return std::tie(lhs.z, lhs.y, lhs.x) < std::tie(rhs.z, rhs.y, rhs.x);
Использование operator<
в кортеже (что дает вам std::tie
) автоматически (и правильно!) выполняет лексикографию c за вас .
На странице cppreference для std::tie
есть хороший пример этого, демонстрирующий, что это обычное дело.