C++ 比较不同大小的数组

C++ 比较不同大小的数组,c++,arrays,boost,comparison,type-safety,C++,Arrays,Boost,Comparison,Type Safety,为了娱乐和教育,我正在实现自己的boost::array变体,我只是想知道:比较两个不同大小的数组是否会产生错误,或者是类型错误 array<int, 3> a = {1, 2, 3}; array<int, 5> b = {1, 2, 3, 4, 5}; a == b // <--- false or type error? 数组a={1,2,3}; 数组b={1,2,3,4,5}; a==b/这应该是一个类型错误。使用boost::array的人选择它而

为了娱乐和教育,我正在实现自己的
boost::array
变体,我只是想知道:比较两个不同大小的数组是否会产生错误,或者是类型错误

array<int, 3> a = {1, 2, 3};
array<int, 5> b = {1, 2, 3, 4, 5};

a == b   // <--- false or type error?
数组a={1,2,3};
数组b={1,2,3,4,5};

a==b/这应该是一个类型错误。使用
boost::array
的人选择它而不是
std::vector
,因为他们希望在编译时而不是运行时进行评估(和失败)。

这个问题没有一个通用的答案。这取决于比较数组的代码的业务逻辑


但一般来说,如果我不知道比较数组的业务逻辑是什么,我会返回
false
。如果数组的大小不相同,则它们会有所不同。

如果数组未公开诸如
数组之类的基类,则会产生类型错误,因为类的函数基于强类型。如果确实允许大小中存在多态性,则返回false


更重要的是,在所有情况下都返回相同值的运算符有什么好处?

在该语言中,不同的模板实例化是不相关的类型。这意味着从技术上讲,最简单的事情就是boost::array所做的事情:忽略这个问题,如果您试图比较不同的大小,编译器会大叫


我倾向于回答这取决于您正在建模的域,但鉴于数组大小是一个编译时常量,用户应该知道两个数组是不同的,甚至不需要进行比较。即使在模板化的代码中,只要有一个大小参数,一切都会自行安排。

不同大小的数组并不相等,在您的情况下,您在编译时就知道了。不要对不同的大小执行相等运算符;那没有意义!你知道他们已经不平等了

我认为这个问题比唯一的
=
操作员更普遍

==
运算符与
密切相关=,并可能绑定到
=

定义应该在所有数组中保持一致,即可以比较两个不同大小的数组(无论使用什么比较),也可以不进行比较

我认为这两种方法都可能有用:

  • 编译时错误:警告您这里有可疑之处
  • 运行时错误:您不必专门化所有模板方法来处理不同的大小
但只有一个在编译期间产生警告,另一个暗示您希望在运行时(通过测试)发现问题。因此,我将提供一个“安全”操作符重载,以及一个更详细的“软”比较方法:

template <typename T, size_t M, size_t N>
bool soft_equal(array<T,M> const& lhs, array<T,N> const& rhs)
{
  if (M != N) { return false; }
  // comparison logic
}

template <typename T, size_t M>
bool operator==(array<T,M> const& lhs, array<T,M> const& rhs)
{
  return soft_equal(lhs,rhs); // count on the compiler to eliminate the 'if'
}
模板
布尔软_相等(阵列常数和lhs、阵列常数和rhs)
{
如果(M!=N){返回false;}
//比较逻辑
}
模板
布尔运算符==(数组常量和lhs、数组常量和rhs)
{
返回soft_equal(lhs,rhs);//指望编译器消除“if”
}
这样,你可以两全其美,我认为:

  • 粗心者在编辑时受到警告
  • 如果有意的话,编译时错误可以很容易地解决

<强> >容易,正确,很难搞错.< /P> < P> C++,<代码>数组< /COD>和数组< /C> >不同类型,就像<代码> STD::vector < /COD>和


现在,您可以将两者视为序列,然后进行比较。然而,要做到这一点,通常使用迭代器

是的,应该是这样。老实说,没有一个答案总是有意义的——有时候你需要一个词汇比较,有时候这是一个明显的逻辑错误。@Jerry:词汇比较可能意味着第三个结果:true。我不认为两个不同大小的数组是相等的,如果是为了娱乐和教育。两者都做。至少对于这个问题的细微变化,我认为
true
是一个合理的答案。在图形中,经常使用矩阵进行变换。可以将3x3矩阵转换为产生相同变换的4x4矩阵。对于某些目的,考虑两个相等是相当合理的。内联OP= =如何总是返回false影响性能?@弗莱德:根本没有,我重新回答了答案。?@Space_C0wb0y:如果这个答案是你的推理,那么它就是循环逻辑;解释如下:“Fred应该决定类型错误,因为使用Fred数组的人会使用它,因为在这种情况下它有一个类型错误。”@Fred:我在回家的路上考虑过这个问题,得出了相同的结论。如果在运行时对其他比较进行求值(它们必须这样做,因为数组中的值不是编译时常量),那么在运行时对这种特殊情况求值将是不一致的。虽然它们是不同的类型,但这并不一定排除比较,即使是。@Fred:不,不排除。但这应该是一个提示,提示不要通过
operator=()
执行此操作。