Было опубликовано много хороших ответов, но я хотел бы добавить еще один.
Не все числа могут быть представлены с помощью float / double. Например, будет представлено число «0,2» как «0.200000003» в одинарной точности в стандарте по плавающей точке IEEE754.
Модель для хранения действительных чисел под капотом представляет собой число с плавающей запятой в качестве
Хотя вы можете легко ввести 0.2
, FLT_RADIX
и DBL_RADIX
равно 2; не 10 для компьютера с FPU, который использует «Стандарт IEEE для двоичной арифметики с плавающей запятой (ISO / IEEE Std 754-1985)».
. Точно так же трудно точно представлять такие числа. Даже если вы укажете эту переменную явно без какого-либо промежуточного вычисления.
Да.
В C ++ 14 вы можете использовать свой собственный компаратор, который объявляет int const*
как transparent . Это позволило бы перегрузить шаблон из find()
, который может сравнивать ключи с произвольными типами. См. Соответствующий вопрос SO . И вот объяснение Джонатана Вакели .
Если вы хотите сохранить const int*
s, сохраните const int*
s. Если вы хотите сохранить int*
s вместо этого, то сделайте это, но вы не можете смешивать и сопоставлять это (по крайней мере, не без хака, который вы уже использовали).
Выберите один и придерживайтесь его.
Есть ли хороший способ избежать const_cast ниже, сохраняя константную корректность?
blockquote>Я не уверен, что то, что я собираюсь предложить, квалифицируется как «хороший способ» ». Тем не менее, вы можете избежать
const_cast
, если вы не возражаете против итерации по содержимому набора самостоятельно. Имейте в виду, что это преобразует то, что может быть операцией O (log (N)) для операции O (N).bool isPtrInSet(const int* ptr) const { for ( auto p : m_set ) { if ( p == ptr ) { return true; } } return false; }