Форум программистов, компьютерный форум CyberForum.ru

Можно ли разширять матрицу без удаления предыдущей - C++

Восстановить пароль Регистрация
 
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
24.08.2014, 13:09     Можно ли разширять матрицу без удаления предыдущей #1
Интересует вопрос, можно ли разширять матрицу без удаления предыдущей.

Покажу сразу пример:
Допустим есть некая структура, и так я её первоначально заполняю:
C++
1
2
3
4
var **v;
v = new var*[CMY];//динамическая матрица
    for (int i = 0; i < CMY; i++)
        v[i] = new var[CMX];
И так CMY - это кол-во строк, а CMX - кол-во столбцов.
Исходя из логики использования delete[], матрица должна быть непрерывна в памяти чтоб её можно было корректно удалить.
Я понимаю что в случае с обычным массивом при выделении памяти: "v[i] = new var[CMX];" память выделяется в соответствии с размером самой структуры VAR(либо конкретным типом), однако мне не понятно сколько выделяется памяти и в соответствии с чем в случае выделения для матрицы: "var **v = new var*[CMY];" ведь тут я так понимаю будет лишь указатель.
Вообще исходя из этого вопроса вытекает следующий, можно ли позже нарастить матрицу(хотя указатель возможно чего то и весит, так что не факт что будет свободное место после первоначальной матрицы), или же можно вообще не париться, и выделять память под матрицу с запасом (имею ввиду, что если "вес" указателя не очень то и большой, то можно и сразу под 100 экземпляров выделить указателей, а в соответствии с надобностью уже заполнять их). Вопрос то возник исходя из того, что наращивание матрицы обычным способом через определение нового экземпляра var **vn (на 1 элемент больше чем **v) и копирование из **v в **vn (с внутренними массивами) слишком затратно получается, и если размеры матрицы превысят ~100, то будет уже долго делать копирование всей информации.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexandr_1982
Нарушитель
175 / 71 / 17
Регистрация: 04.11.2013
Сообщений: 383
Записей в блоге: 4
24.08.2014, 17:32     Можно ли разширять матрицу без удаления предыдущей #2
Нет.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
24.08.2014, 17:51     Можно ли разширять матрицу без удаления предыдущей #3
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос то возник исходя из того, что наращивание матрицы обычным способом через определение нового экземпляра var **vn (на 1 элемент больше чем **v) и копирование из **v в **vn (с внутренними массивами) слишком затратно получается, и если размеры матрицы превысят ~100, то будет уже долго делать копирование всей информации.
При выделении памяти оставляйте резерв, к примеру 10% от текущей потребности. Конкретная цифра подбирается опытным путем.
gru74ik
Модератор
 Аватар для gru74ik
3118 / 1344 / 167
Регистрация: 20.02.2013
Сообщений: 3,810
Записей в блоге: 17
24.08.2014, 17:55     Можно ли разширять матрицу без удаления предыдущей #4
Цитата Сообщение от Izual Посмотреть сообщение
можно ли разширять матрицу без удаления предыдущей
Если только вектор векторов (std::vector).
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.08.2014, 18:12     Можно ли разширять матрицу без удаления предыдущей #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос то возник исходя из того, что наращивание матрицы обычным способом через определение нового экземпляра var **vn (на 1 элемент больше чем **v) и копирование из **v в **vn (с внутренними массивами) слишком затратно получается, и если размеры матрицы превысят ~100, то будет уже долго делать копирование всей информации.
зачем копировать внутренние массивы? достаточно скопировать указатели на них

Добавлено через 11 минут

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
Если только вектор векторов (std::vector).
ох зря ты это предложил, вангую срач в теме на 7 страниц и обвинение в иезуитстве всех кто выразился "нет"

Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
24.08.2014, 19:05  [ТС]     Можно ли разширять матрицу без удаления предыдущей #6
Цитата Сообщение от Jupiter Посмотреть сообщение
обвинение в иезуитстве
Точно)))

Цитата Сообщение от Jupiter Посмотреть сообщение
достаточно скопировать указатели на них
Вот, об этом я как раз сегодня подумал.

А на вопрос о размере двойного указателя (на матрицу) есть соображения? Кстати, на сколько я понимаю, т.к. внутренние указатели на массивы создаются отдельно через new, то значит они могут иметь и не смежные друг с другом и с самой матрицей адреса?

Добавлено через 2 минуты
П.С. Jupiter, знаете почему такая неприязнь у меня к векторам? - Дело даже не в том что они сложно или "не красиво"(на мой взгляд) сделаны, а в том что используя векторы и другую шелуху(а она же реально шелуха, т.к. обёртка^^) сам программист забывает как работать с внутренностями, а хочется всегда помнить, но для этого надо практиковать.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.08.2014, 19:17     Можно ли разширять матрицу без удаления предыдущей #7
Цитата Сообщение от Izual Посмотреть сообщение
Кстати, на сколько я понимаю, т.к. внутренние указатели на массивы создаются отдельно через new, то значит они могут иметь и не смежные друг с другом и с самой матрицей адреса?
именно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 14:01     Можно ли разширять матрицу без удаления предыдущей
Еще ссылки по теме:

Алгоритм удаления гласных букв из строки без использования методов класса String C++
Удаление файла без возможности его удаления. Подскажите, с чего начать. C++
Как можно транспонировать матрицу NxM из одномерного массива? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
25.08.2014, 14:01     Можно ли разширять матрицу без удаления предыдущей
  #8

Не по теме:

Цитата Сообщение от Izual Посмотреть сообщение
а в том что используя векторы и другую шелуху(а она же реально шелуха, т.к. обёртка^^) сам программист забывает как работать с внутренностями, а хочется всегда помнить, но для этого надо практиковать.
Практиковать здесь ключевое слово, практика практикой, но чем проще написан код тем лучше. Вместо того, чтобы заботиться об очистке массивов при исключениях и прочих нестандартных ситуациях при использовании ручной работы с памятью, можно использовать контейнеры, которые все это инкапсулируют и очищают память при выходе из области видимости. Вообщем, ваш аргумент не аргумент.

Yandex
Объявления
25.08.2014, 14:01     Можно ли разширять матрицу без удаления предыдущей
Ответ Создать тему
Опции темы

Текущее время: 22:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru