Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

24.08.2014, 13:09. Просмотров 269. Ответов 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, то будет уже долго делать копирование всей информации.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2014, 13:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли разширять матрицу без удаления предыдущей (C++):

Как открыть файл на запись без удаления содержимого? - C++
нужно записать в определенную позицию в файле, а значит ios::app не подойдет. Неужели никак?

Удаление файла без возможности его удаления. Подскажите, с чего начать. - C++
есть задачка удаление файла без возможности его удаления, подскажите с чего начать? и нужно ли использовать WinAPI ? может что...

Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки? - C++
Не знаю как правильно здесь реализовать метод добавления и удаления объектов в хранилище без перегрузки. Заранее спасибо. #include...

Алгоритм удаления гласных букв из строки без использования методов класса String - C++
Помогите хоть один написать. это на C# надо, но можно и на C++. Алгоритм удаления гласных букв из строки без использования методов...

Можно ли в Windows заблокировать возможность управления курсором одной из мышей без её удаления - Windows
Имеется система с двумя подключенными мышами. Можно ли в среде Windows заблокировать возможность управления курсором одной из этих мышей...

Как создать матрицу, содержащую элементы с 3-го по последний из предыдущей матрицы? - Matlab
Пусть есть матрица-столбец. Как создать матрицу, содержащую элементы с 3-го по последний из предыдущей матрицы? например: у= 13 ...

7
Alexandr_1982
177 / 75 / 17
Регистрация: 04.11.2013
Сообщений: 389
Записей в блоге: 4
24.08.2014, 17:32 #2
Нет.
0
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
24.08.2014, 17:51 #3
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос то возник исходя из того, что наращивание матрицы обычным способом через определение нового экземпляра var **vn (на 1 элемент больше чем **v) и копирование из **v в **vn (с внутренними массивами) слишком затратно получается, и если размеры матрицы превысят ~100, то будет уже долго делать копирование всей информации.
При выделении памяти оставляйте резерв, к примеру 10% от текущей потребности. Конкретная цифра подбирается опытным путем.
0
gru74ik
Эксперт CЭксперт С++
4197 / 1845 / 198
Регистрация: 20.02.2013
Сообщений: 4,990
Записей в блоге: 22
24.08.2014, 17:55 #4
Цитата Сообщение от Izual Посмотреть сообщение
можно ли разширять матрицу без удаления предыдущей
Если только вектор векторов (std::vector).
0
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 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 страниц и обвинение в иезуитстве всех кто выразился "нет"

2
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,555
24.08.2014, 19:05  [ТС] #6
Цитата Сообщение от Jupiter Посмотреть сообщение
обвинение в иезуитстве
Точно)))

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

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

Добавлено через 2 минуты
П.С. Jupiter, знаете почему такая неприязнь у меня к векторам? - Дело даже не в том что они сложно или "не красиво"(на мой взгляд) сделаны, а в том что используя векторы и другую шелуху(а она же реально шелуха, т.к. обёртка^^) сам программист забывает как работать с внутренностями, а хочется всегда помнить, но для этого надо практиковать.
0
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.08.2014, 19:17 #7
Цитата Сообщение от Izual Посмотреть сообщение
Кстати, на сколько я понимаю, т.к. внутренние указатели на массивы создаются отдельно через new, то значит они могут иметь и не смежные друг с другом и с самой матрицей адреса?
именно
0
ForEveR
25.08.2014, 14:01     Можно ли разширять матрицу без удаления предыдущей
  #8

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 14:01
Привет! Вот еще темы с ответами:

Запись в один файл без стирания предыдущей - Delphi
Сейчас у меня при записи - перезаписывается постоянно adel.txt А как сделать - чтобы записывался - не стерая предыдущую запись -...

Образовать матрицу: каждая последующая строка будет удвоенным произведением значением предыдущей - Turbo Pascal
Образовать массив А(7,8) следующим образом: каждая последующая строка будет удвоенным произведением значением предыдущей. Добавлено...

Не считывая матрицу в память, реорганизовать файл, сделав матрицу квадратной (n * n) путем удаления "лишних" строк, начиная с первой. - Turbo Pascal
2. Матрица вещественных чисел А размерности m * n (m &gt; n) записана на диске в виде файла с именем MATROLD.XXX. Не считывая матрицу в...

Освобождение консоли для выполнения следующей команды без останова предыдущей - RedHat, Fedora Linux
Приветствую всех! Собственно сабж. Имеется стенд из четырех серваков. На сиим стенде необходимо по очереди запускать, к примеру:...


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

Или воспользуйтесь поиском по форуму:
8
25.08.2014, 14:01
Ответ Создать тему
Опции темы

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