Как исправить двухмерный вектор, выходящий за пределы диапазона при транспонировании на месте? - PullRequest
0 голосов
/ 14 апреля 2020

В моей функции transpose() я заметил, что если я сделаю j<numCols внутри вложенного l oop: нижний индекс вектора будет вне диапазона. Но если я сделаю j<numRows, результат будет выглядеть так:

Оригинальный вектор:

    1    2    3    4    5
    1    2    3    4    5
    1    2    3    4    5

Транспонированный вектор:

    1    1    1    4    5
    2    2    2    4    5
    3    3    3    4    5

Я предполагаю, что есть проблема с изменением размера, потому что мой исходный 2D-вектор совпадает с транспонированным? Если я изменю display2dVector() и переключу строки и столбцы для отображения транспонированной матрицы, я получу еще одну ошибку вне диапазона. То же самое происходит, когда я меняю эти две переменные.

#include <iostream>
#include <vector>
#include <cassert>
#include <iomanip>

class Matrix
{
public:
    Matrix() : data{} {};

    Matrix(const int rows, const int cols);

    void resize();

    void transpose();

    void fill2dVector();

    void display2dVector() const;

private:
    size_t numRows, numCols;
    std::vector<std::vector<double> > data;
};

Matrix::Matrix(const int rows, const int cols)
{
    numRows = rows;
    numCols = cols;
}

void Matrix::resize()
{
    data.resize(numRows);
    for (size_t i=0; i<numRows; ++i)
    {
        data.at(i).resize(numCols);
    }
}

void Matrix::transpose()
{
    for (size_t i=0; i<numRows; ++i)
    {
        for (size_t j=i+1; j<numCols; ++j)
        {
            std::swap(data[i][j],data[j][i]);
        }
    }
}

void Matrix::display2dVector() const
{
    for (size_t r=0; r<data.size(); ++r)
    {
        for (size_t c=0; c<data[0].size(); ++c)
        {
            std::cout << std::setw(5) << data[r][c];
        }
        std::cout << std::endl;
    }
}

void Matrix::fill2dVector()
{
    for (size_t r=0; r<numRows; ++r)
    {
        std::cout << "Enter " << numCols << " values for row #" << r << std::endl;
        for (size_t c=0; c<numCols; ++c)
        {
            std::cin >> data[r][c];
        }
        std::cout << std::endl;
    }
}

int main()
{
    std::cout << "Enter the size of the matrix:" << std::endl;

    std::cout << "   How many rows? ";
    int numRows;
    std::cin >> numRows;

    std::cout << "How many columns? ";
    int numCols;
    std::cin >> numCols;
    std::cout << std::endl;

    std::cout << "*** numRows = " << numRows << ", " << "numCols = " << numCols << std::endl;
    std::cout << "*** rowSize = " << numRows << ", " << "colSize = " << numCols << std::endl;

    Matrix matrix(numRows,numCols);
    matrix.resize();
    std::cout << "\n*** resize call successful!" << std::endl << std::endl;

    matrix.fill2dVector();

    std::cout << "Contents of the " << numRows << " x " << numCols << " array: " << std::endl;
    matrix.display2dVector();

    std::cout << "\nAfter transpose: " << std::endl;
    matrix.resize();
    matrix.transpose();
    matrix.display2dVector();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...