C++ C++;

C++ C++;,c++,vector,C++,Vector,程序中的以下函数搜索矩阵中的目标值,如果存在,则返回true;如果传递向量-([])或([[]),即传递空向量,则返回false,并给出错误 bool searchMatrix(vector<vector<int>>& matrix, int target) { int i = 0; int m = matrix[0].size(); int n = matrix.size();

程序中的以下函数搜索矩阵中的目标值,如果存在,则返回true;如果传递向量-
([])
([[])
,即传递空向量,则返回false,并给出错误

bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int i = 0;        
        int m = matrix[0].size();        
        int n = matrix.size();        
        int j = m - 1;        
        if(n == 0 || m == 0)
            return false;
        if(target > matrix[n - 1][m - 1] || target < matrix[0][0])
            return false;
        while(j >= 0 && i < n){
            if(matrix[i][j] == target)
                return true;
            if(matrix[i][j] > target)
                j--;
            else
                i++;                        
            }
        return false;
    } 
如果我可以比较matrix.size()和matrix[0],我不明白为什么第一个代码会出现错误。size()与零为什么我不能先将其存储在变量m和n中,然后与零进行比较。

在此表达式中:

if (matrix.size() == 0 || matrix[0].size() == 0)
如果
矩阵
为空,则
|
之前的第一个条件将计算为
,并且由于短路,不会计算右侧

在代码中,您无条件地索引到
矩阵[0]
。如果
matrix
为空,则调用未定义的行为。

如果
matrix.size()
为零,则
m=matrix[0].size()的初始化具有未定义的行为。这是在测试
m
n
之前出现的。
if (matrix.size() == 0 || matrix[0].size() == 0)