|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.10.2015, 15:49 | #1 |
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
|
Как расширить массив в ходе выполнения программы
Нужно сделать динамический массив. Мне уже предлагали list и тп, но у меня сейчас такая ситуация.
Есть длинный текст, его длина, пускай так будет, 1800+1800+1080 символов и может измениться по желанию пользователя. В переменную B нужно бы отправлять лишь первые 1800 элементов массива А. Но мне нужны и первые 1800 символов, и вторые 1800 символов и третьи 1080 символов... Причем 1080 дополняется все-равно до 1800, но не в этом дело. В итоге надо сделать так: B = {string 1 длинной 1800, string 2 длинной 1800, string 3 длинной 1800} Я так и сделал, string[] B = new string[3]. Пользователь уменьшит число символов в тексте - ничего страшного, но у меня в массиве B будут лишние пустые строки, а они мне не нужны. А вот случай 2 - пользователь вводит больше символов, чем можно разместить на 3 строчках. Тогда массив B надо в реальном времени расширить. Я подумал, можно сделать B как массив размерностью 1, а потом расширять его... Но возможно ли это? Если нет, предлагайте, как я могу решить эту задачу? |
20.10.2015, 15:51 | #2 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
21.10.2015, 19:50 | #4 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Расширить массив эффективно невозможно, т.к. его элементы хранятся последовательно. Когда ты создаешь массив - обязательно задаешь его размер (N) и тип элемента (T). Менеджер памяти ищет в памяти свободный кусок на N*sizeof(T) байт.
Чтобы расширить - тебе надо еще какое-то количество байт, которые должны быть свободны прямо следом за твоим массивом. Очевидно, что менеджер не знал что тебе это понадобится и мог занять эту память чем-то другим. Помогут тебе связные структуры данных - любой список, т.к. элементы списка могут храниться не последовательно, а значит, если тебе потребуется еще 1800 байт - ты выделяешь под них память где угодно и добавляешь указатель на эту память к себе в список. Код:
|
23.10.2015, 09:53 | #5 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Дык никто и не спрашивал про эффективность.
И например если нужен произвольный доступ (random access) по индексу элемента, то связный список явно не будет эффективнее. Ну и std::vector же тоже вполне эффективный. Просто он не перевыделяет память на каждое добавление, а заранее выделяет больше памяти. Обычно "по умолчанию" все используют std::vector, а связный список только если необходимость в оптимизации (много добавлений, добавления в середину списка и т.п.) Вопрос про C# был, а не С++. Там List это как std::vector, а LinkedList как std::list
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка в ходе программы, язык Си. | East Undia Trading | Помощь студентам | 40 | 25.04.2014 19:42 |
Написать программу, в ходе выполнения которой... | AzaroffV | Фриланс | 7 | 21.01.2011 15:02 |
Ошибка в ходе программы, требуется пояснение... | kotzzz | Мультимедиа в Delphi | 2 | 14.04.2010 14:31 |
как в цикле создавать массив с одним и тем же именем!?ошибка в ходе выполнения -access violation at addr | sleevman | Помощь студентам | 2 | 28.10.2009 19:06 |
Как очистить Bitmap в ходе выполнения програмы | SeRhy | Помощь студентам | 1 | 06.12.2007 21:47 |