bool isValid(int x, int y, vector<vector<int>> &arr)
{
if (x >= 0 && x <= arr.size() && y >= 0 && y <= arr[0].size() && arr[x][y] == 1)
return true;
return false;
}
- 我在这个(x<=arr.size((和y<arr[0].size(((
- 你们能解释一下为什么我会得到这个吗?即使我没有访问越界值,我只是在比较它
将太多条件组合在一个条件中并不总是好的。将它分为几个条件有助于调试。简单的代码并不总是更少的代码。
bool isValid(int x, int y, vector<vector<int>> &arr) {
// first index is ok?
if (x < 0) return false;
if (x >= arr.size()) return false;
// only now you can access arr[x]
if (y < 0) return false;
if (y >= arr[x].size()) return false;
// both are ok
return arr[x][y] == 1;
}
在代码中,您检查的是arr[0]
而不是arr[x]
,当所有内部向量大小相同时,您可以考虑使用不同的数据结构。即使知道所有内部向量大小相同,也应该检查arr[x]
而不是arr[0]
。还要考虑对索引使用size_t
(它是unsigned
(,然后可以删除对<0
的检查。
您的代码可以segfault,因为最后一个有效索引是size -1
而不是size
,并且arr[0]
不一定具有与arr[x]
相同数量的元素。
如果x == 0
和arr.size() == 0
呢?
在这种情况下,您将无法访问y <= arr[0].size()
表达式中的arr[0]
,因为您正试图访问arr[0]
中存在的向量对象,而这些对象并不存在。
更一般地说,您必须注意,如果x == arr.size()
或y == arr[x].size()
,则访问arr[x][y]
是无效的,但在您的条件下,x <= arr.size()
和y <= arr[0].size()
允许出现这种情况。你的功能最终会像这样:
bool isValid(int x, int y, vector<vector<int>> &arr)
{
if (x >= 0 && x < arr.size() && y >= 0 && y < arr[x].size() && arr[x][y] == 1)
return true;
return false;
}
为什么我得到这个,即使我没有访问越界值,我只是在比较它[?]
考虑y <= arr[0].size()
,在这里您不仅仅是在比较,而是访问arr
的第一个元素并检索其大小。问题是arr
可能是空的,因此arr[0]
将是越界访问。
此外,由于size() - 1
是最后一个有效索引,因此使用<=
是一个错误。
该函数可以像下面的一样重写
bool isValid(int x, int y, std::vector<std::vector<int>> const& m)
{
return x >= 0 and x < m.size() and
// ^
y >= 0 and y < m[x].size() and
// ^ ^^^ Are all the same size?
m[x][y] == 1;
}