Очень простой 2d массив требует всего несколько строк кода
template<typename T>
struct Matrix2d
{
int rows, cols;
std::vector<T> data;
Matrix2d(int rows, int cols) : rows(rows), cols(cols), data(rows*cols)
{ }
T operator()(int i, int j) const { return data[i*cols+j]; }
T& operator()(int i, int j) { return data[i*cols+j]; }
};
Доступ к элементам осуществляется с использованием mat(i, j)
для чтения и mat(i, j) = v
для записи.
Как Джеймс КанзеДля специального случая двухмерного массива также легко получить стандартный синтаксис массива C ++ mat[i][j]
и mat[i][j] = v
для доступа к элементу, используя operator[]
вместо operator()
:
T* operator[](int i) { return &data[i*cols]; }
const T* operator[](int i) const { return &data[i*cols]; }
.Однако решение становится все труднее распространить на большее число измерений (тривиальная проблема с обозначением mat(i, j, k)
).