【问题标题】:2D array bounds checking using std::vector and .at()使用 std::vector 和 .at() 进行二维数组边界检查
【发布时间】:2011-10-10 15:16:25
【问题描述】:

我有一个很简单的问题,但对于女巫,我找不到答案。

如何在vector < vector <type> > 的二维数组中使用.at(i)

我想要进行边界检查 - 女巫 .at(i) 函数自动提供,但我只能使用 array[i][j] 女巫不提供边界检查来访问我的数组。

【问题讨论】:

  • 它是向量的向量。只需将[...] 替换为.at(...)。它还应该如何工作?

标签: c++ vector multidimensional-array


【解决方案1】:

正确使用的语法是:

array.at(i).at(j)

【讨论】:

  • 你是对的。我已经尝试过,但犯了其他错误并且没有完成,所以我认为这是问题所在。
【解决方案2】:

由于.at(i) 将在v[i] 返回对vector 的引用,因此请使用.at(i).at(j)

【讨论】:

  • 你是对的。我已经尝试过,但犯了其他错误并且没有编译,所以我坚持这是问题所在。谢谢。
  • 阅读编译器错误是技能和艺术的平等部分......祝你好运:-)
【解决方案3】:

使用 vec.at(i).at(j) 并且必须在 try-catch 块中使用它,因为如果索引无效,at() 将抛出 std::out_of_range 异常:

try
{
      T & item = vec.at(i).at(j);
}
catch(const std::out_of_range & e)
{
     std::cout << "either index i or j is out of range" << std::endl;
}

编辑:

正如你在评论中所说:

我实际上希望程序在出现异常时停止。 – jbssm 5 分钟前

在这种情况下,您可以在打印超出范围的消息后在catch 块中重新抛出,这样您就可以知道它停止的原因。以下是您重新投掷的方式:

catch(const std::out_of_range & e)
{
     std::cout << "either index i or j is out of range" << std::endl;
     throw; //it rethrows the excetion
}

【讨论】:

  • 谢谢。我实际上希望程序在出现异常时停止。
  • 在这种情况下,您可以在打印超出范围的消息后在catch 块中重新抛出,这样您就可以知道它停止的原因。
  • 在这种情况下,根本不要尝试/捕捉。
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 2020-08-20
  • 2023-04-03
  • 2018-01-01
  • 2021-06-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多