如何打印二维向量的所有对角线元素
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++ 很容易地制定。
我正在寻找一种使用向量的 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++ 很容易地制定。