Двухмерные динамические массивы C++

Задание:

Написать программу, которая удаляет из двухмерного массива, заполненного случайными числами, строки, содержащие нулевые элементы.

void DeleteNullRow(int**& originalArr, int& sizeRow, int& sizeCol) {
    int** originalArrCopy = new int*[sizeRow];
    for (int i = 0; i < sizeRow; i++) {
        originalArrCopy[i] = new int[sizeCol];
    }
    for (int i = 0; i < sizeRow; i++) {
        for (int j = 0; j < sizeCol; j++) {
            if (originalArr[i][j] != 0) {
                originalArrCopy[i][j] = originalArr[i][j];
            }
        }
    }
    delete[]originalArr;
    originalArr = originalArrCopy;
    sizeCol--;

Значит, вот моя функция удаления строк, содержащих нулевые элементы. Здесь я пытался найти нулевые элементы в массиве, поставил условие и он находит.

В моих мыслях было создать массив копию int** originalArrCopy = new int*[sizeRow]; которое должен был заполниться уже строки без нулевых элементов.

Я удалил старый массив и записал в нее уже новый. Вроде бы он норм скомпилился, но работает не правильно. Видимо с логикой функции я намудрил что то. Можете подсказать в каких местах именно я ошибся?


Ответы (1 шт):

Автор решения: Harry

Не понимаю смысла ваших телодвижений. Вы создаете новый массив, потом не удаляя полностью старый, перезаписываете, не меняете количество строк в нем...

Просто переписываем прямо по месту ненулевые строки, удаляем лишние, исправляем число строк...

Примерно так:

void DeleteNullRow(int** a, int& rows, int cols)
{
    int newRow = 0;
    for(int j = 0; j < rows; ++j)
    {
        bool has0 = false;
        for(int i = 0; i < cols; ++i)
            if (a[j][i] == 0) { has0 = true; break; }
        if (!has0)
        {
            for(int i = 0; i < cols; ++i)
                a[newRow][i] = a[j][i];
            newRow++;
        }
    }
    for(int i = newRow; i < rows; ++i) delete[] a[i];
    rows = newRow;
}

Пример полной программы - https://ideone.com/yG1zJi

→ Ссылка