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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
#1

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

24.08.2014, 13:09. Просмотров 255. Ответов 7
Метки нет (Все метки)

Интересует вопрос, можно ли разширять матрицу без удаления предыдущей.

Покажу сразу пример:
Допустим есть некая структура, и так я её первоначально заполняю:
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2014, 13:09     Можно ли разширять матрицу без удаления предыдущей
Посмотрите здесь:

Как считать матрицу из файла без указания размерности? C++
Можно ли как то выводить трехмерную матрицу в консоли? C++
C++ Можно сделать так чтобы каждый раз не вводить матрицу?
C++ ios::app не позволяет работать с seekp() или Update файла без удаления в нем информации при его октрытии
Можно ли выжить без C++/CLI? C++
C++ можно ли обойтись без IF ?
Вывести на экран матрицу без указателей и рандома C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexandr_1982
176 / 72 / 17
Регистрация: 04.11.2013
Сообщений: 382
Записей в блоге: 4
24.08.2014, 17:32     Можно ли разширять матрицу без удаления предыдущей #2
Нет.
kazak
3032 / 2353 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
24.08.2014, 17:51     Можно ли разширять матрицу без удаления предыдущей #3
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос то возник исходя из того, что наращивание матрицы обычным способом через определение нового экземпляра var **vn (на 1 элемент больше чем **v) и копирование из **v в **vn (с внутренними массивами) слишком затратно получается, и если размеры матрицы превысят ~100, то будет уже долго делать копирование всей информации.
При выделении памяти оставляйте резерв, к примеру 10% от текущей потребности. Конкретная цифра подбирается опытным путем.
gru74ik
Модератор
Эксперт CЭксперт С++
3924 / 1682 / 189
Регистрация: 20.02.2013
Сообщений: 4,742
Записей в блоге: 21
24.08.2014, 17:55     Можно ли разширять матрицу без удаления предыдущей #4
Цитата Сообщение от Izual Посмотреть сообщение
можно ли разширять матрицу без удаления предыдущей
Если только вектор векторов (std::vector).
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 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
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
24.08.2014, 19:05  [ТС]     Можно ли разширять матрицу без удаления предыдущей #6
Цитата Сообщение от Jupiter Посмотреть сообщение
обвинение в иезуитстве
Точно)))

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

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

Добавлено через 2 минуты
П.С. Jupiter, знаете почему такая неприязнь у меня к векторам? - Дело даже не в том что они сложно или "не красиво"(на мой взгляд) сделаны, а в том что используя векторы и другую шелуху(а она же реально шелуха, т.к. обёртка^^) сам программист забывает как работать с внутренностями, а хочется всегда помнить, но для этого надо практиковать.
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 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++
C++ Можно ли обойтись без mutex?
C++ Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки?

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

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

Не по теме:

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru