Другие языки программирования и технологии

С++: Как изменять размеры многомерных динамических массивов по ходу выполнения программы?

Задан двумерный динамический массив, размеры которого вводятся с клавы. Далее, массив полностью заполняется значениями. Каким образом можно увеличить размеры массива (добавить N строк и M столбцов) во время выполнения программы, при этом не удаляя значений, которые уже в массиве есть?
Из коробки никак. Только вручную самому все писать. Хочешь удалить строчку - сносишь ее из памяти, затем начиная с ее индекса и до конца сдвигаешь последующие строчки вверх на 1 позицию. Удаление столбца сложнее - пробегаешь по каждой строчке и в каждой сдвигаешь элементы на 1 влево, начиная с позиции удаляемого элемента.

Для твоих целей лучше юзать std::vector (динамический массив):

std::vector m;
...
// удаление строчки с индексом 5
m.erase(m.begin() + 5);

// удаление столбца с индексом 3
for (int i = 0; i < m.size(); ++i) {

m.at(i).erase(m.at(i).begin() + 3);
}

Блин, не так вопрос прочитал) Чтобы изменить размер - нужно выделить память под массив нужного размера и переписать в него все элементы из старого, старый удалить.

...
// добавить пустую строчку в конец матрицы
m.push_back();

// добавить элемент в конец i-ою строчки матрицы
m.at(i).push_back();

// добавить в на k-ое место
m.insert(k, new_item);
AN
Altan Naran
3 999
Лучший ответ
А вариант с выделением максимальной памяти и изменением максимального на данный момент количества элементов не подходит?
Тогда пропадает необходимость постоянной перезаписи массивов (указателей), это накладные расходы
кури динамические массивы
Есть 2 варианта:
1) взять 1-мерный массив, занять память, в конце освободить. А при работе, пересчитывать 2 индекса в 1 индекс. ИМХО это самый стандартный способ.
2) Взять массив указателей, а указывать будут на 1-мерные массивы. Но придется каждый массив, по 2-му индексу, отдельно резервировать, также отдельно освобождать. Это применяют, когда по 2-му индексу разные размеры.
Сергей Мишин
Сергей Мишин
48 987
> Как изменять размеры многомерных динамических массивов
Если массивы динамические, они должны сами уметь менять свой размер.
MP
Maxim Perevochshikov
36 282
Хм malloc realoc - разве не изменяет размер без удаления данных
А вот и примерчик из учебника
Следующая программа выделяет 17 байт памяти, копирует строку «this is 16 chars» в эту об­ласть, а затем использует функцию realloc(), с тем чтобы увеличить размер блока до 18 байт и поместить в конце точку.
#include
#include
#include
int main(void)
{
char *p;
p = (char *) malloc(17);
if(!p) {
printf("Allocation error.");
exit (1);
}
strcpy(p, "This is 16 chars");
p = (char *) realloc (p,18);
if(!p) {
printf("Allocation error.");
exit (1);
}
strcat (p, ".");
printf(p);
free(p);
return 0;
}
http://www.cplusplus.com/reference/vector/vector/resize/

Если нужно еще освобождать память, плюнув на производительность, то см.
http://www.cplusplus.com/reference/vector/vector/shrink_to_fit/ (C++11, реальное осовбождение памяти не гарантировано - вопрос на усмотрении компилятора)

Для принудительного освобождения лишней памяти можно сделать ручками "усеченную" версию вектора и ей сказать swap с оригиналом (C++98), это намного шустрее и безопаснее по исключениям по сравнению с обычным присваиванием векторов.

Если нужно по каким-то причинам написать самописный динамический массив, то см. realloc.