在下面的代码中,我的印象是所有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 :(得分: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))