【问题标题】:C++ vector lower and upper bound checkC++向量上下限检查
【发布时间】:2014-06-16 09:21:42
【问题描述】:

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

我的问题是,我没有在 std::vector 中找到像 vec.isok(n) 这样的调用,它直接表示如果 yesno 索引在范围内。 p>

我忽略了吗?在我的情况下,它会使代码更整洁。

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

【问题讨论】:

  • 阅读这样的文字墙总是很高兴
  • 请突出显示并格式化您未来的问题。否则它们很难阅读和理解。

标签: c++ vector std stdvector indexoutofboundsexception


【解决方案1】:

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

【讨论】:

  • 或者,只需添加一个独立的函数vectorIndexOk 或类似的。
  • 如果您需要参考,请参阅this implementation
【解决方案2】:

最简单的方法:

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)

【讨论】:

  • 检查 ">= 0" 不是无关紧要吗?或者有没有size_type not 未签名的实现?
  • @lethal-guitar 这很好,我认为size_type 可以签名,但显然文档指定将始终未签名(在这种情况下,我怀疑编译器无论如何都会摆脱检查)。
【解决方案3】:

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

您也可以使用其他一些数据结构。如果这些项目可以有键(任何唯一标识符),你可以去找一张地图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多