如何打印二维向量的所有对角线元素

How to print all the diagonal elements of a 2d vector

我正在寻找一种使用向量的 C++ 方法来获取(方形)矩阵的所有对角线,表示为二维向量。

matrix = [
[1,2,3,4],
[5,1,2,3],
[9,5,1,2]]

但我很难想出一种生成所有对角线的方法。我正在寻找的输出是:

"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4 ]".

我找到了答案,但所有答案都在 python 中。我需要 C++

解决方案相当直接。我会先展示代码再解释。

#include <iostream>
#include <vector>

using Matrix = std::vector<std::vector<int>>;

int main() {

    Matrix matrix{
        {1,2,3,4},
        {5,1,2,3},
        {9,5,1,2}
    };
    // Shortcut for the width and height of the matrix
    const size_t width{ matrix.at(0).size() };
    const size_t height{ matrix.size() };

    // Set start row and start column
    size_t startRow{ height-1 };
    size_t startColumn{ 0 };
    size_t column{};

    // for all possible start positions
    do {
        // set the row and column values to the start values
        size_t row{ startRow };
        column = startColumn;

        //Now go through the diagonal
        do {
            // Show current value
            std::cout << matrix[row][column] << ' ';

            // Set next position in the diagonal
            ++row;      // Go one row down
            ++column;   // Go one column to the right

          // As long as we do not cross the border
        } while ((row < height) && (column < width));

        std::cout << '\n';

        // Calculate new start row and start column
        // If possible
        if (startRow > 0) {
            // Go up
            --startRow;
        }
        else {
            // Else go right
            ++startColumn;
        }
    } while (startColumn < width);

    return 0;
}

所以,我们需要稍微玩一下索引。

对角线的索引非常简单。简单地从一个 startPosition 开始,然后我们在每一步中增加行和列,直到我们到达边界。

对于对角线的起始位置,我们将从左下边界开始。然后我们将保留列并减少行。如果该行为 0,则我们向右移动,直到到达边界。

所有这些都可以用 C++ 很容易地制定。