主对角线仅存在于方阵,即行数等于列数的矩阵;非方阵需先校验行列相等,否则循环累加arri会越界或漏算,推荐显式传入尺寸并用下标遍历。

主对角线只存在于方阵,非方阵要先判断
主对角线定义是行索引等于列索引的元素集合,即 arr[i][i]。这意味着数组必须是 n × n 的——行数和列数相等。如果传入的是 int arr[3][5] 这类矩形数组,直接循环 i 从 0 到 n 会越界或漏算。
实操建议:
- 用
std::vector<:vector>></:vector>时,先检查vec.size() == vec[0].size(),否则抛异常或返回0 - 用 C 风格数组(如
int a[4][4])时,维度已知,可硬编码n = 4,但别假设sizeof(a)/sizeof(a[0])能安全推出列数——它只给出行数 - 函数接口里最好显式传入
size_t n,避免依赖模板推导或宏定义
用 for 循环累加 arr[i][i] 最直接可靠
不需要额外库、不依赖迭代器,纯下标访问效率最高,也最易调试。所有主流编译器都能对此做良好优化(比如自动向量化,前提是没副作用)。
示例(方阵):
立即学习“C++免费学习笔记(深入)”;
int sum = 0;
for (size_t i = 0; i < n; ++i) {
sum += arr[i][i];
}
注意点:
- 循环变量用
size_t或int均可,但若n可能为0,用size_t更安全(避免无符号回绕) - 不要写成
for (int i = 0; i ——当 <code>n == 0时,n-1是极大正数,导致无限循环 - 如果数组元素是浮点型,用
double sum = 0.0,避免隐式转换损失精度
用 std::accumulate + lambda 适合已有 vector 容器
当数据在 std::vector<:vector>></:vector> 中,且你倾向 STL 风格,可以封装成一行逻辑,但要注意:它不是“更优”,只是风格不同。
示例:
int sum = std::accumulate(vec.begin(), vec.end(), 0,
[i = 0](int acc, const auto& row) mutable {
return acc + row[i++];
});
问题与限制:
- 必须捕获并修改
i,用mutable和引用捕获,否则编译失败 - 如果
vec为空,i不会递增,但row[i]会越界——需提前判空 - 性能通常略低于原始 for 循环(函数调用开销 + 捕获对象),尤其小矩阵(
n )无优势
常见错误:把次对角线当主对角线,或混淆索引方向
次对角线是 arr[i][n-1-i],有人误以为“从左上到右下”就是主对角线,结果在行优先存储(C++ 默认)下,把内存连续块当成几何对角线。还有的把二维索引写反,比如 arr[j][i] 当作主对角线元素。
调试技巧:
- 打印前几个
i和对应值:std::cout - 手动验证小例子:对
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}},主对角线是1+5+9=15,不是3+5+7 - 如果结果始终为
0,检查是否忘了初始化sum = 0,或数组本身未赋值
n 正确、索引不越界、累加类型匹配——这些地方一错,结果就不可信。


















