C++ 使用std::out_超出逻辑的_范围是错误的吗?

C++ 使用std::out_超出逻辑的_范围是错误的吗?,c++,arrays,exception,try-catch,C++,Arrays,Exception,Try Catch,在我的项目中,我有很多类似的情况: constexpr size_t element_count = 42; std::array<bool, element_count> elements; for(size_t i = 0; i < element_count; ++i){ if(i > 0 && elements[i - 1]){/*do something*/} else{/*do something else*/} if

在我的项目中,我有很多类似的情况:

constexpr size_t element_count = 42;
std::array<bool, element_count> elements;

for(size_t i = 0; i < element_count; ++i){
    if(i > 0 && elements[i - 1]){/*do something*/}
    else{/*do something else*/}
    if(i < element_count - 1 && elements[i + 1]){/*do something*/}
    else{/*do something else*/}
}
for(size_t i = 0; i < element_count; ++i){
    try{
        if(elements.at(i - 1)){/*do something*/}
    }
    catch(const std::out_of_range& e){/*do something else*/}
    try{
        if(elements.at(i + 1)){/*do something*/}
    }
    catch(const std::out_of_range& e){/*do something else*/}
}

在本例中,代码较多,但在我的实际项目中,它将减少代码量,因为我使用了大量多维数组,并对多维进行边界检查。

从某种意义上讲,它可以工作,但仅此而已。使用异常(这是您在这里似乎正在做的)通常是有原因的,我想我从来没有在循环中看到过这样的情况:

  • 使代码的阅读和推理变得更加困难,这也是因为异常会用于流控制(而不是用于错误处理,这在C++中是指错误处理)
  • 更难阅读通常也意味着更难写作,更难发现错误
  • 实际上您已经犯了一个错误,或者至少引入了一个行为更改:i>0&&elements[i-1]求值为false不会导致调用“其他东西”
  • 如果代码量的减少导致可读性降低或代码更差,那么它就不再是一个好目标
  • 可能表现不太好

现在,查看实际代码会很有趣,但我怀疑它可能不需要任何边界检查,例如,使循环从1开始,而不是从0开始。或者,如果这是一个递归模式,您可以为迭代编写一个helper函数(或使用现有的on),在一次迭代中访问多个元素。这将是代码量的减少,这实际上是值得的。

从某种意义上说,这不会有问题,但仅此而已。使用异常(这是您在这里似乎正在做的)通常是有原因的,我想我从来没有在循环中看到过这样的情况:

  • 使代码的阅读和推理变得更加困难,这也是因为异常会用于流控制(而不是用于错误处理,这在C++中是指错误处理)
  • 更难阅读通常也意味着更难写作,更难发现错误
  • 实际上您已经犯了一个错误,或者至少引入了一个行为更改:i>0&&elements[i-1]求值为false不会导致调用“其他东西”
  • 如果代码量的减少导致可读性降低或代码更差,那么它就不再是一个好目标
  • 可能表现不太好

现在,查看实际代码会很有趣,但我怀疑它可能不需要任何边界检查,例如,使循环从1开始,而不是从0开始。或者,如果这是一个递归模式,您可以为迭代编写一个helper函数(或使用现有的on),在一次迭代中访问多个元素。这将减少代码量,这实际上是值得的。

如果相关,您可以增加数组的大小以避免绑定检查(因此只有
[1;element\u count+1[
是实值)。请注意,您两个代码段做的事情并不相同(当值在范围内且为false时)。如果相关,您可以增加数组的大小以避免绑定检查(因此只有
[1;element\u count+1[
是实值)。请注意,两个代码段的作用不同(当值在范围内且为false时)。