我有零个NxN矩阵。我想将存储在std::vector中的数据写入此矩阵的右上角三角形(包括对角线)。我的问题是我需要按特定顺序将数据写入其中:让我的源数据 vector 是data,而我们要写入的矩阵是mtr,其大小例如为5x5。

因此,应将data[0]写入mtr[0][4](右上顶点)。
data[1]-mtr[0][3]; data[2]-mtr[1][4](三角形的第二个“行”)。
data[3]-mtr[0][2]; data[4]-mtr[1][3]; data[5]-mtr[2][4](三角形的第三个“行”)。等等。从示例中可以看到-我需要将数据逐行依次写入该三角形。

我只是想不出合适的循环。

最佳答案

怎么样:

int data_index = 0;
for (int diagonal = N-1; diagonal >= 0; --diagonal) {
    for (int i = 0; i + diagonal < N; ++i) {
        mtr[i][i+diagonal] = data[data_index];
        ++data_index;
    }
}

只需确保对diagonal进行了签名(在此示例中为int),或将其补语用于N-1并将减量更改为增量即可。

或者,您可以使用类似的想法为矩阵创建一个迭代器。这是一个粗略的示例(正确的迭代器将更加完整,因此更加复杂):
template<int N>
class Matrix<N>::DiagonalIterator {
    Matrix<N>& m;
    int row;
    int column;
public:
    using difference_type = int;
    using value_type = int;
    using pointer = int*;
    using reference = int&;
    using iterator_category = std::input_iterator_tag;

    DiagonalIterator(Matrix<N>& m, int row, int column)
    : m(m), row(row), column(column) {
    }

    auto operator*() -> int& {
        return m.inner[row*N + column];
    }

    auto operator++() -> Matrix<N>::DiagonalIterator& {
        if (row == N-1) {
            row = N-column;
            column = 0;
        } else if (column == N-1) {
            column = N-2-row;
            row = 0;
        } else {
            ++row;
            ++column;
        }

        return *this;
    }
};

Live on Coliru

10-06 04:53