Найти указатель в std :: set на основе указателя const [duplicate]

Было опубликовано много хороших ответов, но я хотел бы добавить еще один.

Не все числа могут быть представлены с помощью float / double. Например, будет представлено число «0,2» как «0.200000003» в одинарной точности в стандарте по плавающей точке IEEE754.

Модель для хранения действительных чисел под капотом представляет собой число с плавающей запятой в качестве

Хотя вы можете легко ввести 0.2, FLT_RADIX и DBL_RADIX равно 2; не 10 для компьютера с FPU, который использует «Стандарт IEEE для двоичной арифметики с плавающей запятой (ISO / IEEE Std 754-1985)».

. Точно так же трудно точно представлять такие числа. Даже если вы укажете эту переменную явно без какого-либо промежуточного вычисления.

10
задан Danra 9 May 2016 в 14:20
поделиться

3 ответа

Да.

В C ++ 14 вы можете использовать свой собственный компаратор, который объявляет int const* как transparent . Это позволило бы перегрузить шаблон из find(), который может сравнивать ключи с произвольными типами. См. Соответствующий вопрос SO . И вот объяснение Джонатана Вакели .

3
ответ дан Community 26 August 2018 в 05:30
поделиться

Если вы хотите сохранить const int* s, сохраните const int* s. Если вы хотите сохранить int* s вместо этого, то сделайте это, но вы не можете смешивать и сопоставлять это (по крайней мере, не без хака, который вы уже использовали).

Выберите один и придерживайтесь его.

2
ответ дан Lightness Races in Orbit 26 August 2018 в 05:30
поделиться

Есть ли хороший способ избежать const_cast ниже, сохраняя константную корректность?

Я не уверен, что то, что я собираюсь предложить, квалифицируется как «хороший способ» ». Тем не менее, вы можете избежать 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;
}
0
ответ дан R Sahu 26 August 2018 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: