C ++ Распределение памяти. матрица

Я посмотрел на два разных метода для выделения памяти для элементов матрицы

Способ №1

int** matrix = new int*[rows];
for (int i = 0; i < rows; ++i)
matrix[i] = new int[cols];

Метод № 2

int** matrix = new int*[rows];
if (rows)
{
matrix[0] = new int[rows * cols];
for (int i = 1; i < rows; ++i)
matrix[i] = matrix[0] + i * cols;
}

Я могу выяснить, что делает Метод n.1, но я не могу понять, что именно должно делать предложение if в методе n.2 (я бы реализовал его без, и он не работает, с предложением if, оно делает…)

РЕДАКТИРОВАТЬ: Вот код, показывающий мою проблему. Почему загрузка занимает так много времени (~ 30 секунд)?

http://codepad.org/uKvI8Tk3

Codepad отказывается показывать вывод (тайм-аут), поэтому, если вы хотите запустить его, просто скомпилируйте его самостоятельно.

Кроме того, почему Cout << операторы не выполняются после запуска программы?

0

Решение

Метод № 3: написать свой собственный класс Matrix, внутренне используя один std::vector<int> и быть умным в доступе по индексам (row, col).

struct Matrix
{
explicit Matrix(unsigned int rows, unsigned int cols) : data_(rows*cols), cols_(cols) {}
const int& operator()(unsigned int row, unsigned int col) const
{
return data_[row*cols_ + col];
}
private:
std::vector<int> data_;
unsigned int cols_;
};

Редактировать: тогда и только тогда излишняя память вектора является проблемой в последнем примере, вы можете рассмотреть возможность использования одного динамически распределяемого массива длины rows*colsи обязательно позвоните delete [] на это в деструкторе.

5

Другие решения

Метод № 2 выделяет уникальный блок, содержащий последовательность всех строк. Следовательно, первая строка является указателем на весь блок. Если строки == 0, у вас нет места для хранения указателя на (пустое) пространство, поэтому вы не можете сделать выделение.

Я бы пошел к методу 4, предложенному в другом ответе:

class Matrix {
Matrix(int rows, int cols): rows_(rows), cols_(cols) {
data_ = new int[rows*cols];
}

~Matrix() {
delete[] data_;
}

int &operator()(int i,int j) {return data_[cols_*i+j];}

int operator()(int i,int j) const {return data_[cols_*i+j];}

private:
int rows_,cols_;
int *data_;
};
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector