Я хотел бы присвоить уникальный объект множеству значений с плавающей запятой. При этом я изучаю два разных варианта:Кэширование значений с плавающей запятой в C++
Первый вариант - сохранить статическую хэш-карту (std::unordered_map<double,Foo*>
) в классе и избежать того, чтобы дубликаты создавались в первую очередь. Это означает, что вместо вызова конструктора я проверю, уже ли значение в хеше, и если да, повторите его использование. Мне также нужно будет удалить значение из хэш-карты в деструкторе.
Второй вариант - разрешить дублирование значений во время создания, только чтобы попытаться отсортировать их все сразу и обнаружить дубликаты после создания всех значений. Наверное, мне нужны хэш-карты для этой сортировки. Или же упорядоченная карта ('std :: map) работает так же хорошо?
Есть ли основания ожидать, что первый вариант (который мне больше нравится) будет значительно медленнее в любой ситуации? То есть, поиск повторяющихся записей будет намного быстрее, если я буду выполнять все записи одновременно, а не одну запись за раз?
Я знаю о подводных камнях при обналичивании чисел с плавающей запятой и предотвращает добавление к карте не-чисел и бесконечностей. Некоторые повторяющиеся записи для одной и той же константы также не являются проблемой, если это произойдет для нескольких записей - это приведет лишь к очень малой скорости.
Что о * большой * западне с числами с плавающей точкой? Они не точны? Как вы справляетесь с этим? – jalf
@jalf Число с плавающей запятой точно. Точное значение может не быть ожидаемым или желаемым, но каждое число с плавающей запятой имеет точное значение. Что касается использования их в качестве ключей в хеш-таблице, это зависит от источника чисел. –
Ну, мой объект 'Foo' будет содержать копию числа с плавающей запятой, поэтому я могу просто проверить, совпадает ли этот номер с номером хэш-ключа. Опять же, несколько дубликатов записей (их будет мало) не является серьезной проблемой. – Joel