Единственная практическая проблема, связанная с вашим решением, заключается в том, что вы используете vector
из vector
с, что может быть немного неэффективно, поскольку существует дополнительный уровень косвенности при доступе к внутреннему vector
.
Лучше выделить один vector
для хранения всей матрицы, поэтому:
class Matrix
{
public:
vector<int> data;
int width;
Matrix(int w, int h) : data (w * h), width(w)
{
}
int& elementAt(int x, int y)
{
// Offset the row with y * width, then in the row the xth element
return data[y * width + x];
}
...
Вместо vector
вы можете просто выделить блок памяти, управляя им в unique_ptr
::
class Matrix
{
public:
unique_ptr<int[]> data;
int width;
Matrix(int w, int h)
: data (new int[w * h]), width(w) // Allocate dynamic array in unique_ptr
{
// Initialize data to zero
}
int& elementAt(int x, int y)
{
// Offset the row with y * width, then in the row the xth element
return data[y * width + x];
}
...
Но мне интересно, в чем суть. Я не вижу никакой очевидной разницы в эффективности. Оба автоматически освобождают память.
Функционально, у вас уже есть дополнительный шаг - обнуление данных (конечно, вы можете этого не хотеть). Кроме того, одна вещь, которую вы не имеете, это общий размер данных. vector
хранит свой собственный размер, а массив - нет, поэтому вам, вероятно, придется отдельно хранить height
, а также ширину.
Плюс векторы, как правило, легче программировать.