Хотя многим нравится ваш подход, если вы хотите, чтобы он был быстрым (как, например, с матрицей, вам нужен отдельный блок памяти и индексируйте его самостоятельно.
ЕстьЭто объясняется несколькими причинами. Во-первых, вам нужно выделить один блок памяти для вектора верхнего уровня и один вектор для каждой строки (или столбца, поскольку вы из земли FORTRAN ....)
Таким образом, вместо одной операции у вас есть n + 1.
Это применяется каждый раз, когда вы обрабатываете этот объект, копируете, уничтожаете, что у вас есть. Вы также сохраняете издержки вектора (размер, емкость) для каждой строки. Конечно, если каждая строка имеет разный размер, это особенность.
Итак, рассмотрим следующее, жестко закодированное для удвоения для ясности: посмотрите, насколько прост конструктор, и насколько простоперация, аналогичная + =, так как она может просто последовательно проходить весь блок, игнорируя индексацию.
Индексировать отдельный элемент через два массива также медленнее.как получить доступ к вектору верхнего уровня из объекта, найти указатель, перейти туда и найти второй указатель.
Произвольная индексация обеспечивается в операторе ()
class Matrix {
private:
int m_rows, m_cols;
double* m_data;
public:
Matrix(int rows, int cols) : m_rows(rows), m_cols(cols), m_data(new double[rows*cols]
{}
~Matrix() { delete [] m_data; }
Matrix(const Matrix& orig) m_rows(orig.m_rows), m_cols(orig.m_cols),
m_data(new double[m_rows * m_cols]
{}
// operator = too....
Matrix& operator +=(const Matrix& right) {
assert(m_rows == right.m_rows && m_cols == right.m_cols);
for (int i = 0; i < m_rows*m_cols; i++)
m_data[i] += right.m_data[i];
}
double& operator()(int r, int c) { return m_data[r * m_cols + c]; }
double operator()(int r, int c) const { return m_data[r * m_cols + c]; }
};