<p>副对角线索引规律是i + j == n - 1;仅对方阵严格成立,非方阵取从(0, width-1)起、i++且j--至越界的最长斜线。</p>

副对角线的索引规律是什么
副对角线(从右上到左下)在 n×n 方阵中,每个元素的行索引 i 和列索引 j 满足关系:i + j == n - 1。比如 4×4 数组中,(0,3)、(1,2)、(2,1)、(3,0) 就是副对角线位置。
注意:这个规律只对方阵严格成立;如果是非方阵(如 3×5),副对角线没有统一定义,常见做法是取“能画出的最大斜线”,即从 (0, width-1) 开始,每次 i++ 且 j--,直到任一索引越界。
用 for 循环遍历副对角线元素(C++原生数组)
直接按索引推算最清晰,避免嵌套循环全扫:
int arr[4][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9,10,11,12},
{13,14,15,16}
};
int n = 4;
for (int i = 0; i < n; ++i) {
int j = n - 1 - i;
std::cout << arr[i][j] << " "; // 输出:4 7 10 13
}- 不要用
i和j双重嵌套再判断i+j==n-1,效率低且易读性差 - 若数组是动态分配的(如
int** arr),只要知道n,逻辑完全一样 - 如果是
std::vector<std::vector<int>></int>,记得先检查vec.size()和每行长度是否一致,否则访问vec[i][n-1-i]可能越界
std::array 或 std::vector 场景下的安全访问
用容器时,副对角线访问本身没区别,但越界风险更隐蔽:
立即学习“C++免费学习笔记(深入)”;
-
std::array<std::array<int, 4>, 4>:编译期尺寸固定,i和j仍用n-1-i,无需额外检查 -
std::vector<std::vector<int>></int>:必须确认每行长度 ≥n - i,否则vec[i].at(n-1-i)会抛std::out_of_range - 常见错误:误把
vec.size()当作列数,其实它只是行数;列数得看vec.empty() ? 0 : vec[0].size()
非方阵怎么处理副对角线
没有标准定义,但实际项目里常需兼容矩形数组。推荐按“起始点 + 步进”方式提取:
int rows = 3, cols = 5;
for (int i = 0, j = cols - 1; i < rows && j >= 0; ++i, --j) {
std::cout << arr[i][j] << " "; // 从 (0,4) → (1,3) → (2,2),共3个元素
}- 这种写法自动适配任意
rows × cols,长度为min(rows, cols) - 别硬套
i+j==cols-1,因为i最大是rows-1,可能根本达不到等式成立的条件 - 如果业务要求“从左下到右上”的另一条斜线,起始点换成
(rows-1, 0),步进改为--i, ++j
副对角线看似简单,但方阵假设、越界检查、非方阵语义这三点,实际写错的概率远高于主对角线。


















