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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> быстродействующий способ добавить char в массив 
:(
    Опции темы
elCreator
Дата 2.1.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть массив типа char, создается динамически. Как добавить в него 1 символ, наиболее оптимальным способом, (в какой-то момент в массиве может быть всего 1 элемент)?
(как strcat, только она не работает, если параметром является char, а не строка с из char)
PM WWW ICQ   Вверх
Lazin
Дата 2.1.2008, 19:37 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



наверное, проще всего в место нуля (в конце строки), записать нужный символ, а после него '0', еще нужно не вылезти за границы строки.
PM MAIL Skype GTalk   Вверх
archimed7592
Дата 2.1.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Lazin @  2.1.2008,  19:37 Найти цитируемый пост)
наверное, проще всего в место нуля (в конце строки), записать нужный символ, а после него '0', еще нужно не вылезти за границы строки.

Это в случае, если у этого массива семантика С-style строки. Иначе нужно увеличить в размере данный массив, а для этого нужно:
1. Создать новый массив нужного размера.
2. Скопировать в него данные из старого массива и добавить нужный элемент.
3. Удалить старый массив.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 2.1.2008, 20:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



может, к этой определенной задаче решение и не подходит, но может просто пользоваться std::vector? у него (из-за резервации памяти) вставка происходит одним из самых оптимальных способов

Это сообщение отредактировал(а) Alek86 - 2.1.2008, 20:01


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 2.1.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(archimed7592 @  2.1.2008,  19:48 Найти цитируемый пост)
Это в случае, если у этого массива семантика С-style строки.

Цитата(elCreator @  2.1.2008,  18:48 Найти цитируемый пост)
Есть массив типа char, создается динамически

Цитата(elCreator @  2.1.2008,  18:48 Найти цитируемый пост)
как strcat

мне кажется у меня были основания так думать)))


Цитата(archimed7592 @  2.1.2008,  19:48 Найти цитируемый пост)
1. Создать новый массив нужного размера.
2. Скопировать в него данные из старого массива и добавить нужный элемент.
3. Удалить старый массив. 

Проще юзать realloc.

Цитата(Alek86 @  2.1.2008,  20:00 Найти цитируемый пост)
может, к этой определенной задаче решение и не подходит, но может просто пользоваться std::vector?

ну а чем тогда самый обычный std::string не подходит? Давайте использовать вещи для того для чего они предназначены, vector имеет семантику динамического массива, а string - строки, при этом и там и там добавление символа происходит довольно оптимально)))
PM MAIL Skype GTalk   Вверх
JackYF
Дата 2.1.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Lazin @  2.1.2008,  20:22 Найти цитируемый пост)
Проще юзать realloc.

... а если realloc не сможет, то сделать всё те же самые действия, ага.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 2.1.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Lazin @  2.1.2008,  20:22 Найти цитируемый пост)
Проще юзать realloc.

C only smile.

Добавлено через 47 секунд
Цитата(JackYF @  2.1.2008,  20:56 Найти цитируемый пост)
то сделать всё те же самые действия, ага. 

Точнее он(realloc) сам их сделает, ага smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 2.1.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  2.1.2008,  20:56 Найти цитируемый пост)
Точнее он(realloc) сам их сделает, ага

нет, он просто вернёт NULL, а делать это придётся самим.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 2.1.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



JackYF, наверное мы с тобой друг друга недопонимаем smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 2.1.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Lazin @  2.1.2008,  20:22 Найти цитируемый пост)
ну а чем тогда самый обычный std::string не подходит?

тем, что он не обязан хранить элементы, как массив - то есть в этом случае std::vector чуть быстрее будет отдавать массив данных, чем c_str (в общем случае)
+ массив, вроде, обязан резервировать память именно для скорейшей вставки. про стринг такого не помню...

жаль, что аффтары не указывают язык, на котором хотят получить ответ smile

Добавлено через 1 минуту и 24 секунды
Цитата(Lazin @  2.1.2008,  20:22 Найти цитируемый пост)
vector имеет семантику динамического массива, а string - строки


Цитата(elCreator @  2.1.2008,  18:48 Найти цитируемый пост)
Есть массив типа char, создается динамически.


Добавлено через 5 минут и 21 секунду
и если язык - Си, то, думаю, самое большое быстродействие можно получить, если позаимствовать алгоритм вектора


--------------------
user posted image    user posted image
PM MAIL   Вверх
JackYF
Дата 2.1.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  2.1.2008,  21:18 Найти цитируемый пост)
JackYF, наверное мы с тобой друг друга недопонимаем

Цитата

realloc()  returns  a  pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr, or
       NULL if the request fails.  If size was equal to 0, either NULL or a pointer suitable to be passed to free() is returned.  If realloc() fails  the
       original block is left untouched; it is not freed or moved.

Для реаллока вернуть NULL - нормальная ситуация, если он не может расширить блок. Вдруг за блоком ещё один блок и расширять уже некуда.
В этом случае надо сделать free, затем malloc.





--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 2.1.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



JackYF, вообще-то в документации к realloc не указано, что он может невыполниться из-за фрагментации памяти. На сколько мне известно, алгоритм его работы в этом случае аналогичен malloc()+memcpy()+free().
PM   Вверх
archimed7592
Дата 2.1.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



JackYF, если руководствоваться более достоверным источником(C99), то NULL будет возвращён в случае, если выделение памяти невозможно(т.е. руками тоже не получится).
Цитата(ISO/IEC-9899:1999)

7.20.3 Memory management functions
1 The order and contiguity of storage allocated by successive calls to the calloc,
malloc, and realloc functions is unspecified. The pointer returned if the allocation
succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
and then used to access such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated). The lifetime of an allocated object extends
from the allocation until the deallocation. Each such allocation shall yield a pointer to an
object disjoint from any other object. The pointer returned points to the start (lowest byte
address) of the allocated space. If the space cannot be allocated, a null pointer is
returned.
 If the size of the space requested is zero, the behavior is implementationdefined:
either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.

...

7.20.3.4 The realloc function
Synopsis
1 #include <stdlib.h>
void *realloc(void *ptr, size_t size);
Description
2 The realloc function deallocates the old object pointed to by ptr and returns a
pointer to a new object that has the size specified by size. The contents of the new
object shall be the same as that of the old object prior to deallocation, up to the lesser of
the new and old sizes. Any bytes in the new object beyond the size of the old object have
indeterminate values.
3 Ifptr is a null pointer, the realloc function behaves like the malloc function for the
specified size. Otherwise, if ptr does not match a pointer earlier returned by the
calloc, malloc, or realloc function, or if the space has been deallocated by a call
to the free or realloc function, the behavior is undefined. If memory for the new
object cannot be allocated, the old object is not deallocated and its value is unchanged.
Returns
4 The realloc function returns a pointer to the new object (which may have the same
value as a pointer to the old object), or a null pointer if the new object could not be
allocated.




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 2.1.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



archimed7592, 
bsa, 
тогда вопрос. Почему тогда реализации того же std::vector не юзают, как правило, реаллок, раз он всё выполняет сам?

З.Ы. Вообще хорошо провести бы тест. Если будет время, составлю маленькую тестовую программу.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 2.1.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(JackYF @  2.1.2008,  22:21 Найти цитируемый пост)
Почему тогда реализации того же std::vector не юзают, как правило, реаллок, раз он всё выполняет сам?

Очевидно потому, что realloc может переместить объекты с одного места на другое, что для не-POD'ов недопустимо smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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