![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| KMC |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 12.11.2009 Репутация: нет Всего: нет |
Как сделать в C++ динамический массив строк.?
Чтоб можно было изменить длинну массива |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
std::vector<std::string> string_array;
;) -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
STL
std::vector<std::string> Qt QVector<QString> Вариант для мазохистов и прочих сишников: char ** -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: 1 Всего: 8 |
А он разве динамическим будет? Или что имелось в виду? -------------------- ![]() обычный день на винграде |
|||
|
||||
| djamshud |
|
||||||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
На си типы приводить не нужно, код не такой страшный будет. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
||||||
|
|||||||
| unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: 1 Всего: 8 |
Так и думал, что перераспределение памяти причём в стиле Cи. А вот интересно, можно ли в таком случае считать массив динамическим. Ведь он хоть и меняется в размерах, но по сути такой способ совершенно неэффективен по скорости исполнения, если использовать массив по его прямому динамическому назначению. Нельзя добавить или удалить из памяти лишь нужные элементы, воздействие идёт сразу на весь массив, ведь он представляет собой блок.
То есть в нашем случае вроде как удовлетворяется это условие, однако с другой стороны не совсем. А самое интересное будет не просто менять его размер с конца, а вставлять внутрь элементы. Мне кажется такой вариант неприемлем для динамических структур, не важно мазохист человек или нет. P.S. основная мысль заключалась у меня в том, что если пытаться делать статический массив динамическим, то эти определения вообще лишаются смысла. Так как скорее всего их ввели не для того, чтобы знать может менять размер массив или нет. В конце концов его можно даже просто перекопировать. А чтобы оценивать эффективность в том и ином случае при изменении размеров с такими операциями как вставить или удалить элементы массива. Это сообщение отредактировал(а) unicuum - 30.11.2009, 05:07 -------------------- ![]() обычный день на винграде |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Ээ.. А как по твоему вектор поведёт себя в этом случае? Тупо скопирует (причём безо всяких memcpy, ибо нету никакой оптимизации для POD-типов) элементы и присвоит "серединному" новое значение. И, если размер достигает capacity - то расширение вектора будет вестись таким же перераспределением буфера. Это ведь только обёртка. Вся "динамика" так или иначе достигается с помощью new/malloc. Удаление не с конца - аналогично ведёт к копированию данных. |
|||
|
||||
| unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: 1 Всего: 8 |
Думаю как-то так: ![]() О чём собственно говоря и речь. -------------------- ![]() обычный день на винграде |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Конечно. Так как указатели на "подмассивы" находятся в непрерывном блоке, но сами "подмассивы" разбросаны. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Какое отношение картинка имеет к вопросу? Копирование очень часто будет использоваться (совсем не будет - только для связанных списков). Твоя картинка предоставляет высокоуровневое представление об организации контейнеров. И не имеет никакого отношения к моему вопросу. |
|||
|
||||
| unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: 1 Всего: 8 |
А какой у тебя вопрос? Вот по-моему он так себя и ведёт. Если же это не совпадает с твоим мнением, так и твой вопрос задавался мне, а не себе. -------------------- ![]() обычный день на винграде |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
>Так и думал, что перераспределение памяти причём в стиле Cи. А вот интересно, можно ли в таком случае считать массив динамическим. Ведь он хоть и меняется в размерах, но по сути такой способ совершенно неэффективен по скорости исполнения, если использовать массив по его прямому динамическому назначению. Нельзя добавить или удалить из памяти лишь нужные элементы, воздействие идёт сразу на весь массив, ведь он представляет собой блок.
Если мне не изменяет память, у std::vector есть что-то типа data(), возвращающее указатель на линейный буфер. Представим, что вектор состоит из полумиллиарда элементов-объектов. Вектор, по-вашему, хранится в памяти нелинейно, и что мы получаем? Копирования тьмы блоков памяти в один линейный с вызовом полумиллиарда конструкторов копирования. Шикарный момент полнейшего затыка процесора и операционки, жадно выискивающей свободную память по сусекам, составляя из них блок виртуальной памяти, и вытесняя все, что только можно в своп. В общем, я наверное достаточно ясно описал, почему вектор ведет себя также "нединамично", как и char**. PS. stl-вектор в своих нутрях тоже работает помазахистски. У него просто нет другого выбора. А вот использует ли он для перемещения POD- и простых пользовательских типов реактивные memcpy и memmove, я не знаю. Тот, которым пользуюсь я, делает именно так. Может быть именно поэтому на бенчмарках уделывает stl? Добавлено через 5 минут Не забывайте, что память с обоих концов буфера можно и нужно резервировать, чтобы не realloчить память на каждый добавленный элемент. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| unicuum |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: 1 Всего: 8 |
Нелинейно так понимаю в переводе на мой язык - не единым блоком памяти. Только вот зачем ставить мой комментарий и отвечать на то что сказал andrew_121:
Иными словами то что он делает зависит от реализации. Впрочем если не пытаться вкапываться в сами библиотеки, в книге написано, что быстро добавляются элементы в конец массива. А это уже о многом говорит. Добавлено через 1 минуту и 59 секунд
Здравая мысль, только она не совсем для прикладных программистов. -------------------- ![]() обычный день на винграде |
||||||
|
|||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
>Здравая мысль, только она не совсем для прикладных программистов.
Это реализуется _внутри_ вектора. Внутри нормального, коим, как я думаю, является stl-вектор. Прикладному программисту об этом думать не нужно. >в книге написано, что быстро добавляются элементы в конец массива. А это уже о многом говорит. О чем, простите? >отвечать на то что сказал andrew_121: Он ответил вам совсем другое. Ну да ладно. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| Любитель |
|
||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Наверно, мы просто друг друга не поняли
Чтобы быстро добавлять в конец - достаточно выделять буфер большого размера и хранить логический размер. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |