Кроме того, вы можете сохранить матрицу в векторе и иметь флаг, который определяет, будет ли матрица транспонирована или нет. Тогда вы просто рассчитываете индекс. Вот пример:
class Matrix {
private:
std::vector<int> matrix;
bool isTransposed = false;
int width, height;
public:
// ...
int getElement(int x, int y)
{
int w = width;
int h = height;
if(isTransposed) {
int z = x;
x = y;
y = x;
z = w;
w = h;
h = z;
}
return matrix[y * width + x];
}
// ...
};
Это уменьшит стоимость транспонирования матрицы, но увеличит стоимость фактического доступа к элементам.