繁体   English   中英

C ++:正在访问可能不存在的const向量成员-试试/捕获还是if(count!= 0)?

[英]C++: Accessing possibly non-existent const vector member - try/catch or if (count != 0)?

我想将vector的成员的副本分配给另一个变量(如果该成员存在)。 如果没有,则不应进行分配。 不能对vector进行任何更改。

我可以执行try / catch方法,或者if(exists) / do方法。 是否有理由偏爱一个? 即鉴于此

const vector<int> v = {}; // or maybe {1, 2, 5}
int myInt;

传统条件方法:

if (v.size() >= 2)
{
    myInt = v.at(1);
    // or myInt = v[1];
}

试着抓:

try
{
    myInt = v.at(1);
}
catch(std::out_of_range)
{
}

这主要取决于您自己对异常的看法。 (在我看来)通常给予他们的属性是“异常应该是异常”。

如果在正常执行中您只是因为不想编写检查存在性而抛出该异常,那将与上面的声明相反。

其原因主要是堆栈展开并不总是那么便宜。 虽然,也许vector :: at会被内联,并且不会有任何堆栈可以展开。 也许编译器甚至优化了该异常。

如果您通常在调试矢量访问,可能仍然很麻烦。 例如,如果要捕获所有out_of_bounds异常以跟踪未描述的错误消息,则如果在正常操作期间不断抛出这些异常,则将很难。

在您的情况下,这取决于结果“如果未分配”。

您尝试访问v[1]的代码能否正确处理v.size()1或更小? 例如,通过现场调整v的大小,为变量提供一些默认值。 在那种情况下,没有必要抛出异常-调用者甚至不需要为潜在的错误情况所困扰,因为它将得到纠正。

您的代码是否无法纠正v.size()1或更小,但是调用者有可能恢复的合理可能性? 如果可以合理预期调用者进行检查和恢复,则返回码是适当的(无需抛出异常)。 同样,如果发生错误但没有检查到错误时调用方可以合理地继续正常运行,则再次使用返回码是合适的。 如果不能合理地期望调用者能够恢复,或者如果调用者可以恢复但不能依靠其检查错误情况,则最好抛出异常-要么强制调用者处理错误,要么终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM