В следующем фрагменте кода я был под впечатлением, что все 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;
}
Последнее не сравнивается одинаково, потому что это выражение 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))
sizeof
массива возвращает размер массива в байтах, а не количество элементов в нем.