Другие языки программирования и технологии
С++: Как изменять размеры многомерных динамических массивов по ходу выполнения программы?
Задан двумерный динамический массив, размеры которого вводятся с клавы. Далее, массив полностью заполняется значениями. Каким образом можно увеличить размеры массива (добавить 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);
Для твоих целей лучше юзать 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);
А вариант с выделением максимальной памяти и изменением максимального на данный момент количества элементов не подходит?
Тогда пропадает необходимость постоянной перезаписи массивов (указателей), это накладные расходы
Тогда пропадает необходимость постоянной перезаписи массивов (указателей), это накладные расходы
кури динамические массивы
Есть 2 варианта:
1) взять 1-мерный массив, занять память, в конце освободить. А при работе, пересчитывать 2 индекса в 1 индекс. ИМХО это самый стандартный способ.
2) Взять массив указателей, а указывать будут на 1-мерные массивы. Но придется каждый массив, по 2-му индексу, отдельно резервировать, также отдельно освобождать. Это применяют, когда по 2-му индексу разные размеры.
1) взять 1-мерный массив, занять память, в конце освободить. А при работе, пересчитывать 2 индекса в 1 индекс. ИМХО это самый стандартный способ.
2) Взять массив указателей, а указывать будут на 1-мерные массивы. Но придется каждый массив, по 2-му индексу, отдельно резервировать, также отдельно освобождать. Это применяют, когда по 2-му индексу разные размеры.
> Как изменять размеры многомерных динамических массивов
Если массивы динамические, они должны сами уметь менять свой размер.
Если массивы динамические, они должны сами уметь менять свой размер.
Хм 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;
}
А вот и примерчик из учебника
Следующая программа выделяет 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.
Если нужно еще освобождать память, плюнув на производительность, то см.
http://www.cplusplus.com/reference/vector/vector/shrink_to_fit/ (C++11, реальное осовбождение памяти не гарантировано - вопрос на усмотрении компилятора)
Для принудительного освобождения лишней памяти можно сделать ручками "усеченную" версию вектора и ей сказать swap с оригиналом (C++98), это намного шустрее и безопаснее по исключениям по сравнению с обычным присваиванием векторов.
Если нужно по каким-то причинам написать самописный динамический массив, то см. realloc.
Похожие вопросы
- Помогите с программой на Си. (создание многомерных динамических массивов)
- Написать программу в VBA арифметической прогрессии в динамическом массиве.
- вопрос о динамических массивах в fortran
- Вычислить сумму нечетных элементов в программа С++ .Через статический и динамический массив! Вот я сам написал проверьте
- пожалуйста, напишите мне программу этого вопроса в C ++.пожалуйста помогите. Создать динамический массив из N чисел.
- динамический массив в Visual C++
- Дан двумерный динамический массив, надо составить программу, которая меняет местами две любые строки
- С++ Динамический массив
- Динамический массив. help
- Программирование С++ Что такое Динамические массивы?