В моей функции 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();
}