检查C样式数组是否等于其他(编译时)数组

Ann*_*nna 1 c++

我有一个double[9]并想检查它是否包含值(1,0,0,0,1,0,0,0,1).有比这更清洁的方式吗?

if (ornt1[0] == 1 && ornt1[1] == 0 && ornt1[2] == 0
 && ornt1[3] == 0 && ornt1[4] == 1 && ornt1[5] == 0
 && ornt1[6] == 0 && ornt1[7] == 0 && ornt1[8] == 1 )
Run Code Online (Sandbox Code Playgroud)

我正在使用C++.

izo*_*ica 6

严格比较双值不是一个好主意.我建议你创建一个常量数组进行比较,然后使用一个循环并使用公差(例如1e-9):

bool doublesEqual(double a, double b) {
  return fabs(a - b) < 1e-9;
}

const double expected[9] = {1,0,0,0,1, 0, 0, 0, 1};
bool equal = true;
for (int i = 0; i< 9; ++i) {
  if (!doublesEqual(expected[i], ornt1[i])) {
    equal = false;
    break;
  }
}

if (equal) { // do smth
Run Code Online (Sandbox Code Playgroud)

编辑:正如John Zwinck所建议的那样,我编辑了代码,以便在我们比较的数组只包含NAN时能够处理这种情况.我已经编辑了他的建议,使代码更具可读性.请参阅下面的评论,以澄清为何需要这样做.

  • 考虑如果数组中有NAN会发生什么:`fabs(expected [i] - ornt1 [i])`将返回NAN,并且`NAN> 1e-9`将返回false,因此所有NAN的数组将会错误地"匹配".要解决此问题,请将条件更改为`if(!(std :: abs(expected [i] - ornt1 [i])<= 1e-9))`(注释解释原因,当然,所以未来的维护人员不要打破它. (3认同)