Двухмерные динамические массивы 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 шт):
Не понимаю смысла ваших телодвижений. Вы создаете новый массив, потом не удаляя полностью старый, перезаписываете, не меняете количество строк в нем...
Просто переписываем прямо по месту ненулевые строки, удаляем лишние, исправляем число строк...
Примерно так:
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