Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

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

24.08.2014, 13:09. Показов 1183. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.08.2014, 13:09
Ответы с готовыми решениями:

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

Преобразовать матрицу X(n,m) в матрицу X(a,b) путём удаления лишних строк и столбцов
Преобразовать матрицу X(n,m) в матрицу X(a,b) путём удаления лишних строк и столбцов (n&gt;a,m&gt;b). Порядок удаления: 1) с начала; ...

Сформировать матрицу путем чиклического сдвига предыдущей сроки
Даны действительные числа a1, a2,..., an. Получит квадратную матрицу порядка n

7
 Аватар для Alexandr_1982
191 / 90 / 33
Регистрация: 04.11.2013
Сообщений: 473
Записей в блоге: 4
24.08.2014, 17:32
Нет.
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
24.08.2014, 17:51
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос то возник исходя из того, что наращивание матрицы обычным способом через определение нового экземпляра var **vn (на 1 элемент больше чем **v) и копирование из **v в **vn (с внутренними массивами) слишком затратно получается, и если размеры матрицы превысят ~100, то будет уже долго делать копирование всей информации.
При выделении памяти оставляйте резерв, к примеру 10% от текущей потребности. Конкретная цифра подбирается опытным путем.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
24.08.2014, 17:55
Цитата Сообщение от Izual Посмотреть сообщение
можно ли разширять матрицу без удаления предыдущей
Если только вектор векторов (std::vector).
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
24.08.2014, 18:12
Лучший ответ Сообщение было отмечено Izual как решение

Решение

Цитата Сообщение от Izual Посмотреть сообщение
Вопрос то возник исходя из того, что наращивание матрицы обычным способом через определение нового экземпляра var **vn (на 1 элемент больше чем **v) и копирование из **v в **vn (с внутренними массивами) слишком затратно получается, и если размеры матрицы превысят ~100, то будет уже долго делать копирование всей информации.
зачем копировать внутренние массивы? достаточно скопировать указатели на них

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

Не по теме:

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

2
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
24.08.2014, 19:05  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
обвинение в иезуитстве
Точно)))

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

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

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

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2014, 14:01
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru