Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив строк, Массив строк. 
:(
    Опции темы
KMC
Дата 28.11.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.11.2009

Репутация: нет
Всего: нет



Как сделать в C++ динамический массив строк.?
Чтоб можно было изменить длинну массива
PM MAIL   Вверх
andrew_121
Дата 28.11.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



std::vector<std::string> string_array;

;)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 28.11.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM   Вверх
unicuum
  Дата 30.11.2009, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(djamshud @  28.11.2009,  19:44 Найти цитируемый пост)
Вариант для мазохистов и прочих сишников:
char ** 

А он разве динамическим будет? Или что имелось в виду?


--------------------
user posted image
обычный день на винграде
PM   Вверх
djamshud
Дата 30.11.2009, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Код

#include<stdlib.h>
#include<stdio.h>

int main() {
    char **array=(typeof(array))malloc(sizeof(char*)*2);
    array[0]=(char*)"Hello";
    array[1]=(char*)"World";

    //NOTE: resize
    array=(typeof(array))realloc(array,sizeof(char*)*3);
    array[2]=(char*)"Update";
    for (int i=0;i<3;i++)
        printf("%s\n",array[i]);
    free(array);
    return 0;
}


Код

Hello
World
Update


Код

ERROR SUMMARY: 0 errors from 0 contexts
malloc/free: 2 allocs, 2 frees, 20 bytes allocated


На си типы приводить не нужно, код не такой страшный будет.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
unicuum
Дата 30.11.2009, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(djamshud @  30.11.2009,  02:22 Найти цитируемый пост)
На си типы приводить не нужно, код не такой страшный будет. 

Так и думал, что перераспределение памяти причём в стиле Cи. А вот интересно, можно ли в таком случае считать массив динамическим. Ведь он хоть и меняется в размерах, но по сути такой способ совершенно неэффективен по скорости исполнения, если использовать массив по его прямому динамическому назначению. Нельзя добавить или удалить из памяти лишь нужные элементы, воздействие идёт сразу на весь массив, ведь он представляет собой блок.
Цитата(вики)

Динамическим называется массив, размер которого может меняться во время исполнения программы. 

То есть в нашем случае вроде как удовлетворяется это условие, однако с другой стороны не совсем. А самое интересное будет не просто менять его размер с конца, а вставлять внутрь элементы. Мне кажется такой вариант неприемлем для динамических структур, не важно мазохист человек или нет.

P.S. основная мысль заключалась у меня в том, что если пытаться делать статический массив динамическим, то эти определения вообще лишаются смысла. Так как скорее всего их ввели не для того, чтобы знать может менять размер массив или нет. В конце концов его можно даже просто перекопировать. А чтобы оценивать эффективность в том и ином случае при изменении размеров с такими операциями как вставить или удалить элементы массива.

Это сообщение отредактировал(а) unicuum - 30.11.2009, 05:07


--------------------
user posted image
обычный день на винграде
PM   Вверх
Любитель
Дата 30.11.2009, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(unicuum @  30.11.2009,  05:01 Найти цитируемый пост)
А самое интересное будет не просто менять его размер с конца, а вставлять внутрь элементы.

Ээ.. А как по твоему вектор поведёт себя в этом случае? Тупо скопирует (причём безо всяких memcpy, ибо нету никакой оптимизации для POD-типов) элементы и присвоит "серединному" новое значение. И, если размер достигает capacity - то расширение вектора будет вестись таким же перераспределением буфера. Это ведь только обёртка. Вся "динамика" так или иначе достигается с помощью new/malloc. Удаление не с конца - аналогично ведёт к копированию данных.


--------------------
PM MAIL ICQ Skype   Вверх
unicuum
Дата 30.11.2009, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(Любитель @  30.11.2009,  05:58 Найти цитируемый пост)
Ээ.. А как по твоему вектор поведёт себя в этом случае?

Думаю как-то так:
user posted image
О чём собственно говоря и речь.


--------------------
user posted image
обычный день на винграде
PM   Вверх
andrew_121
Дата 30.11.2009, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(unicuum @  30.11.2009,  05:01 Найти цитируемый пост)
А вот интересно, можно ли в таком случае считать массив динамическим.

Конечно. Так как указатели на "подмассивы" находятся в непрерывном блоке, но сами "подмассивы" разбросаны.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Любитель
Дата 30.11.2009, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(unicuum @  30.11.2009,  07:00 Найти цитируемый пост)
Думаю как-то так:

Какое отношение картинка имеет к вопросу? smile Я имел ввиду, что ничего митстического в стл-контейнерах нету. И:
Цитата(unicuum @  30.11.2009,  05:01 Найти цитируемый пост)
В конце концов его можно даже просто перекопировать

Копирование очень часто будет использоваться (совсем не будет - только для связанных списков).

Твоя картинка предоставляет высокоуровневое представление об организации контейнеров. И не имеет никакого отношения к моему вопросу.


--------------------
PM MAIL ICQ Skype   Вверх
unicuum
  Дата 30.11.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(Любитель @  30.11.2009,  08:05 Найти цитируемый пост)
Твоя картинка предоставляет высокоуровневое представление об организации контейнеров. И не имеет никакого отношения к моему вопросу. 

А какой у тебя вопрос? 
Цитата(Любитель @  30.11.2009,  05:58 Найти цитируемый пост)
Ээ.. А как по твоему вектор поведёт себя в этом случае? 

Вот по-моему он так себя и ведёт. Если же это не совпадает с твоим мнением, так и твой вопрос задавался мне, а не себе. smile 


--------------------
user posted image
обычный день на винграде
PM   Вверх
djamshud
Дата 30.11.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



>Так и думал, что перераспределение памяти причём в стиле Cи. А вот интересно, можно ли в таком случае считать массив динамическим. Ведь он хоть и меняется в размерах, но по сути такой способ совершенно неэффективен по скорости исполнения, если использовать массив по его прямому динамическому назначению. Нельзя добавить или удалить из памяти лишь нужные элементы, воздействие идёт сразу на весь массив, ведь он представляет собой блок.

Если мне не изменяет память, у std::vector есть что-то типа data(), возвращающее указатель на линейный буфер. Представим, что вектор состоит из полумиллиарда элементов-объектов. Вектор, по-вашему, хранится в памяти нелинейно, и что мы получаем? Копирования тьмы блоков памяти в один линейный с вызовом полумиллиарда конструкторов копирования. Шикарный момент полнейшего затыка процесора и операционки, жадно выискивающей свободную память по сусекам, составляя из них блок виртуальной памяти, и вытесняя все, что только можно в своп.

В общем, я наверное достаточно ясно описал, почему вектор ведет себя также "нединамично", как и char**.

PS. stl-вектор в своих нутрях тоже работает помазахистски. У него просто нет другого выбора. А вот использует ли он для перемещения POD- и простых пользовательских типов реактивные memcpy и memmove, я не знаю. Тот, которым пользуюсь я, делает именно так. Может быть именно поэтому на бенчмарках уделывает stl? smile

Добавлено через 5 минут
Не забывайте, что память с обоих концов буфера можно и нужно резервировать, чтобы не realloчить память на каждый добавленный элемент.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
unicuum
Дата 30.11.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(djamshud @  30.11.2009,  11:43 Найти цитируемый пост)
Вектор, по-вашему, хранится в памяти нелинейно, и что мы получаем? 

Нелинейно так понимаю в переводе на мой язык - не единым блоком памяти. Только вот зачем ставить мой комментарий и отвечать на то что сказал andrew_121:
Цитата(andrew_121 @  30.11.2009,  07:35 Найти цитируемый пост)
Конечно. Так как указатели на "подмассивы" находятся в непрерывном блоке, но сами "подмассивы" разбросаны. 


Цитата(djamshud @  30.11.2009,  11:43 Найти цитируемый пост)
PS. stl-вектор в своих нутрях тоже работает помазахистски. У него просто нет другого выбора. А вот использует ли он для перемещения POD- и простых пользовательских типов реактивные memcpy и memmove, я не знаю. Тот, которым пользуюсь я, делает именно так. Может быть именно поэтому на бенчмарках уделывает stl?

Иными словами то что он делает зависит от реализации. Впрочем если не пытаться вкапываться в сами библиотеки, в книге написано, что быстро добавляются элементы в конец массива. А это уже о многом говорит. smile

Добавлено через 1 минуту и 59 секунд
Цитата(djamshud @  30.11.2009,  11:43 Найти цитируемый пост)
Не забывайте, что память с обоих концов буфера можно и нужно резервировать, чтобы не realloчить память на каждый добавленный элемент. 

Здравая мысль, только она не совсем для прикладных программистов.


--------------------
user posted image
обычный день на винграде
PM   Вверх
djamshud
Дата 30.11.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



>Здравая мысль, только она не совсем для прикладных программистов. 

Это реализуется _внутри_ вектора. Внутри нормального, коим, как я думаю, является stl-вектор. Прикладному программисту об этом думать не нужно. 

>в книге написано, что быстро добавляются элементы в конец массива. А это уже о многом говорит.

О чем, простите? 

>отвечать на то что сказал andrew_121:

Он ответил вам совсем другое. Ну да ладно.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Любитель
Дата 30.11.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(unicuum @  30.11.2009,  08:35 Найти цитируемый пост)
Вот по-моему он так себя и ведёт. Если же это не совпадает с твоим мнением, так и твой вопрос задавался мне, а не себе. 

Наверно, мы просто друг друга не поняли smile  У тебя было странное заявление о том, что динамичность вручную нединамичноа. Я с этим не согласился.

Цитата(unicuum @  30.11.2009,  12:00 Найти цитируемый пост)
Впрочем если не пытаться вкапываться в сами библиотеки, в книге написано, что быстро добавляются элементы в конец массива. А это уже о многом говорит. 

Чтобы быстро добавлять в конец - достаточно выделять буфер большого размера и хранить логический размер.


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.