C++:访问可能不存在的const向量成员 - try/catch或if(count!= 0)?

cp.*_*ngr 1 c++ stl try-catch c++11

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

我可以做try/ catch方法,或if(exists)/做方法.是否有理由偏爱另一个?即鉴于此

const vector<int> v = {}; // or maybe {1, 2, 5}
int myInt;
Run Code Online (Sandbox Code Playgroud)

传统的条件方法:

if (v.size() >= 2)
{
    myInt = v.at(1);
    // or myInt = v[1];
}
Run Code Online (Sandbox Code Playgroud)

试着抓:

try
{
    myInt = v.at(1);
}
catch(std::out_of_range)
{
}
Run Code Online (Sandbox Code Playgroud)

小智 5

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

如果在正常执行中你将抛出该异常,只是因为你不想编写检查存在,那么这将违背上述语句.

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

如果您通常调试向量访问,它可能仍然是一个麻烦.例如,如果要捕获所有out_of_bounds异常以跟踪非描述性错误消息,那么如果在正常操作期间继续抛出这些异常,则会更难.