Джеймс Керран и Грег С. уже показали вам два основных подхода к решению проблемы.
- определяют функтор, который будет явно использоваться в алгоритмах STL, которые в этом нуждаются, или
- определяют действительные операторы
==
и <
, которые используют алгоритмы STL, если не указан функтор.
Оба решения прекрасно работают и идиоматичны, но при определении операторов следует помнить, чтоони эффективно расширяют тип.Как только вы определили operator<
для glm::vec3
, эти векторы расширяются для определения отношения «меньше чем», что означает, что каждый раз, когда кто-то хочет проверить, является ли один вектор «меньше» другого, он будет использоватьваш оператор.Поэтому операторы должны использоваться только в том случае, если они универсально применимы.Если это всегда единственный способ определить менее чем взаимосвязь между трехмерными векторами, сделайте это оператором.
Проблема в том, что, вероятно, это не так.Мы могли бы упорядочить векторы несколькими различными способами, и ни один из них не является «правильным».Например, вы можете упорядочить векторы по длине.Или по величине x
, в частности, игнорируя y
и z
.Или вы можете определить некоторые отношения, используя все три компонента (скажем, если ax == bx, проверьте координаты y. Если они равны, проверьте координаты z)
Не существует очевидного способа определить, является ли один вектор«меньше» другого, поэтому оператор, вероятно, является неправильным путем.
Для равенства оператор может работать лучше.У нас есть одно определение равенства для векторов: два вектора равны, если каждый компонент равен.
Единственная проблема здесь состоит в том, что векторы состоят из значений с плавающей запятой, и поэтому вы можете захотеть сделать что-то вродесравнения эпсилон, поэтому они равны, если все члены равны почти .Но тогда вы также можете захотеть, чтобы эпсилон был переменным, а это невозможно сделать в operator==
, так как он принимает только два параметра.
Конечно, operator==
может просто использовать какой-то видзначение эпсилона по умолчанию и функторы могут быть определены для сравнения с переменными эпсилонами.
Нет однозначного ответа на вопрос, на что отдавать предпочтение.Оба метода действительны.Просто выберите тот, который наилучшим образом соответствует вашим потребностям.