C ++向量下限和上限检查

时间:2014-04-30 06:57:23

标签: c++ vector std stdvector indexoutofboundsexception

我使用[]来访问数学代码中的向量。我不想使用at(),因为我不喜欢异常。当我不确定我的索引时,我很高兴明确检查代码中的边界。所以,我的代码中充满了这种语句:if(n >= 0 && n < vec.size())

我的问题是,我没有在std::vector中找到像vec.isok(n)这样的电话直接说明了没有索引是否在界限。

我忽略了吗?在我的情况下,它会产生更多更简洁的代码。

顺便说一下,我认为显式检查比at()调用更有效,因为我通常使用嵌套的向量结构,当我检查索引n一次时,我会使用{{ 1}}在n括号内多次,有时数千次。所以,我的问题是,你是否在if中没有进行两次测试就看到了一种更简洁的方法。谢谢!

3 个答案:

答案 0 :(得分:4)

是的,std::vector没有像std::vector::isOK(x)那样的事情。您可以在std::vector中扭曲SafeVector并发布要使用的安全接口。

答案 1 :(得分:3)

最简单的方法:

template <typename T>
inline bool isok(const std::vector<T>& vec,
                 typename std::vector<T>::size_type index)
{
    return index >= 0 && index < vec.size();
}

然后将其称为isok(vec, i)

答案 2 :(得分:1)

您可以拥有自己的访问向量索引的实现。在您的这个功能中,您可以使用这些检查(一次性投资)并使用此功能以便以后访问。但同样,即使你使用这个函数,你仍然需要担心它在返回索引时会返回什么。

您还可以使用其他一些数据结构。如果这些项目可以包含密钥(任何唯一标识符),则可以使用地图。