Вы можете решить проблему итератора вне диапазона, добавив дозорные значения 0x000000
и 0xFFFFFF
(один раз). Таким образом, у вас всегда будет действительный нижний и верхний предел. Конечно, это может повлиять на результат вашего алгоритма. Например. если ваш «самый маленький» реальный цвет был чисто-синим (0x0000FF
), то темно-синий (0x00007F
) теперь найдет черный, а не чистый синий. Конечно, это легко исправить двумя сравнениями.
С дозорными на месте, звоните QMap::lower_bound
. Вам нужно проверить, действительно ли вы нашли точное совпадение: если *lower_bound
- это то значение, которое вы хотите, верните его. Иначе, lower_bound
указывает на первый элемент, который больше, чем ваш ввод. Следовательно, --lowerbound
указывает на последний элемент, который меньше вашего ввода. Проверьте, какой из двух ближе.
Обратите внимание, что единственный способ lower_bound
может указывать на begin
- это когда ваш ввод точно равен 0x000000
(часовой), и в этом случае вы не получите --lower_bound
. Там нет ошибки диапазона. По той же логике, конечный страж 0xFFFFFF
означает, что вы всегда найдете lower_bound
.