Сравнения с использованием std :: равенства и оператора равенства

0

В следующем фрагменте кода я был под впечатлением, что все 3 проверки равенства были эквивалентными, однако последний, похоже, возвращает другой результат от других 2 - почему это так?

#include <cstdio>
#include <vector>
#include <algorithm>

int main()
{
   {
      std::vector<double> d0 { 0.0 , 1.0, 2.0};
      std::vector<double> d1 { 1.0 , 2.0, 3.0};

      d0[0] += double(1);
      d0[1] += double(1);
      d0[2] += double(1);

      if (std::equal(std::begin(d0),std::end(d0),std::begin(d1)))
         printf("equal\n");
      else
         printf("not equal\n");

      if (d0 == d1)
         printf("equal\n");
      else
         printf("not equal\n");

   }

   {
      double d0[] { 0.0 , 1.0, 2.0};
      double d1[] { 1.0 , 2.0, 3.0};

      d0[0] += double(1);
      d0[1] += double(1);
      d0[2] += double(1);

      if (std::equal(d0,d0 + sizeof(d0),d1))
         printf("equal\n");
      else
         printf("not equal\n");
   }

   return 0;
}
  • 0
    @ ShafikYaghmour вы правы, я сделал изменение, это была опечатка. Проблема все еще остается.
  • 1
    sizeof массива возвращает размер массива в байтах, а не количество элементов в нем.
Теги:
floating-point
comparison
equality

1 ответ

1
Лучший ответ

Последнее не сравнивается одинаково, потому что это выражение d0 + sizeof(d0) не делает того, чего вы ожидаете. sizeof применяется к массиву, оценивает размер массива в байтах, а не количество элементов в массиве. Таким образом, вы не создаете итератор для одного последнего элемента в d0.

Используйте один из них вместо этого

if (std::equal(d0, d0 + sizeof(do0)/sizeof(d0[0]), d1))

или

#include <type_traits>

...

if (std::equal(d0, d0 + std::extent<decltype(d0)>::value, d1))

или

#include <iterator>

...

if (std::equal(std::begin(d0), std::end(d0), d1))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню