二维数组判断空的情况
在C++中,matrix.empty() || matrix[0].empty()
用于判断二维向量matrix
是否为空或其首行是否为空,这是处理二维数组/向量时常见的边界条件检查。以下是对这两个条件的详细分析和区别:
一、matrix.empty()
作用
判断二维向量matrix
是否为空(即没有任何行)。
- 当
matrix
是空向量时,matrix.size() == 0
,此时访问matrix[0]
会导致越界错误(未定义行为)。
示例
vector<vector<int>> matrix; // 空二维向量
if (matrix.empty()) {cout << "矩阵为空,没有任何行"; // 会执行
}
二、matrix[0].empty()
作用
判断二维向量matrix
的首行是否为空(即首行没有任何元素)。
- 前提:必须确保
matrix
非空(即matrix.size() > 0
),否则访问matrix[0]
会导致越界。
示例
vector<vector<int>> matrix = {{}}; // 包含一个空行的二维向量
if (!matrix.empty() && matrix[0].empty()) {cout << "首行是空行"; // 会执行
}
三、组合使用的原因
在LeetCode 240题的代码中,matrix.empty() || matrix[0].empty()
用于处理以下两种无效情况:
- 矩阵整体为空(
matrix.empty()
为真):
例如:matrix = {}
(空向量)。 - 矩阵非空但首行空(
matrix[0].empty()
为真):
例如:matrix = {{}, {1,2}}
(首行是空向量)。
代码逻辑
if (matrix.empty() || matrix[0].empty()) return false;
- 若矩阵整体为空,直接返回
false
(无元素可搜索)。 - 若矩阵非空但首行空,说明矩阵结构无效(行有元素但列数为0),同样无法搜索,返回
false
。
四、常见错误场景
1. 遗漏matrix.empty()
检查
if (matrix[0].empty()) return false; // 错误!可能访问空矩阵的matrix[0]
- 当
matrix
为空时,matrix[0]
会触发越界,导致程序崩溃。
2. 错误理解二维矩阵结构
二维矩阵的有效条件是:
- 行数
m = matrix.size() > 0
, - 列数
n = matrix[0].size() > 0
(假设所有行的列数相同,LeetCode题目通常保证这一点)。
matrix.empty() || matrix[0].empty()
确保至少有一个非空行存在。
五、与其他边界条件的对比
条件表达式 | 含义描述 |
---|---|
matrix.empty() | 矩阵无任何行(空矩阵) |
matrix[0].empty() | 矩阵首行无元素(首行是空行) |
matrix.size() == 0 | 等价于matrix.empty() |
matrix[0].size() == 0 | 等价于matrix[0].empty() |
总结
matrix.empty() || matrix[0].empty()
是二维向量/矩阵的常见合法性检查,用于确保:
- 矩阵至少有一行(非空)。
- 首行至少有一个元素(非空行)。
这两个条件组合使用可以避免访问空指针或越界,是处理二维数据结构时的必要安全措施。在LeetCode题目中,若题目明确保证矩阵非空且每行非空,该检查可省略;但为了代码的鲁棒性,通常建议保留。