Не могу понять процесс создания динамической матрицы в коде
Вот сам код:
#include<iostream>
using namespace std;
int main() {
int n, m, max, min, max_i = 0 , min_i = 0; // n - размер строки, m - столбца
cout << "Input n, m:\n";
cin >> n >> m;
int** mtr = new int* [m]; // выделение памяти под матрицу с использованием указателей (динамически)
for (int i = 0; i < m; i++) {
mtr[i] = new int[n];
}
cout << "Input matrix " << n << " x " << m << ":\n";
for (int i = 0; i < m; i++) { // вводим значения матрицы
for (int j = 0; j < n; j++) {
cin >> mtr[i][j];
}
}
min = max = mtr[0][0]; // пусть минимальный и максимальный - первый элемент матрицы
for (int i = 0; i < m; i++) { // проходимся по всем элементам матрицы и ищем максимальный и минимальный элемент
for (int j = 0; j < n; j++) {
if (mtr[i][j] > max) {
max = mtr[i][j];
max_i = i;
}
if (mtr[i][j] < min) {
min = mtr[i][j];
min_i = i;
}
}
}
if (max_i != min_i) { // если min и max в одной строке то ничего не меняем
for (int j = 0; j < n; j++) { // меняем строки местами
swap(mtr[min_i][j], mtr[max_i][j]); // вместо swap можем менять элементы нативно
}
}
cout << "\nMatrix:\n";
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << mtr[i][j] << ' ';
}
cout << '\n';
}
for (int i = 0; i < m; i++) { // освобождаем память занятую под матрицу в строках 12, 14
delete[] mtr[i];
}
delete[] mtr;
return 0;
}
Не понимаю, что происходит тут:
int** mtr = new int* [m]; // выделение памяти под матрицу с использованием указателей (динамически)
for (int i = 0; i < m; i++) {
mtr[i] = new int[n];
И тут:
for (int i = 0; i < m; i++) { // освобождаем память занятую под матрицу в строках 12, 14
delete[] mtr[i];
}
delete[] mtr;
То есть я прочитал, что выделяется память под использование матрицы и что после выполнения кода память освобождается, но я не понимаю что происходит по существу. Дайте, пожалуйста, построчный комментарий к выделенным строкам.
Ответы (1 шт):
Выделение памяти под матрицу
int** mtr = new int* [m]; // выделение памяти под матрицу с использованием указателей (динамически)
Эта строка выделяет память под массив указателей на целые числа. Каждый указатель будет указывать на строку в матрице. Количество указателей равно количеству строк в матрице (m
).
for (int i = 0; i < m; i++) {
mtr[i] = new int[n];
}
Этот цикл выделяет память под каждую строку в матрице. Для каждой строки выделяется массив целых чисел. Количество целых чисел в каждой строке равно количеству столбцов в матрице (n
).
Освобождение памяти
for (int i = 0; i < m; i++) { // освобождаем память занятую под матрицу в строках 12, 14
delete[] mtr[i];
}
Этот цикл освобождает память, выделенную под каждую строку в матрице.
delete[] mtr;
Эта строка освобождает память, выделенную под массив указателей на строки.
Построчный комментарий
// Выделение памяти под массив указателей на строки
int** mtr = new int* [m];
// Цикл по строкам матрицы
for (int i = 0; i < m; i++) {
// Выделение памяти под строку матрицы
mtr[i] = new int[n];
}
// Цикл по строкам матрицы
for (int i = 0; i < m; i++) {
// Освобождение памяти, выделенной под строку матрицы
delete[] mtr[i];
}
// Освобождение памяти, выделенной под массив указателей на строки
delete[] mtr;
Надеюсь что помог!