![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| elCreator |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 21.7.2007 Репутация: нет Всего: -1 |
Есть массив типа char, создается динамически. Как добавить в него 1 символ, наиболее оптимальным способом, (в какой-то момент в массиве может быть всего 1 элемент)?
(как strcat, только она не работает, если параметром является char, а не строка с из char) |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
наверное, проще всего в место нуля (в конце строки), записать нужный символ, а после него '0', еще нужно не вылезти за границы строки.
|
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Это в случае, если у этого массива семантика С-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 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
может, к этой определенной задаче решение и не подходит, но может просто пользоваться std::vector? у него (из-за резервации памяти) вставка происходит одним из самых оптимальных способов
Это сообщение отредактировал(а) Alek86 - 2.1.2008, 20:01 |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
мне кажется у меня были основания так думать)))
Проще юзать realloc.
ну а чем тогда самый обычный std::string не подходит? Давайте использовать вещи для того для чего они предназначены, vector имеет семантику динамического массива, а string - строки, при этом и там и там добавление символа происходит довольно оптимально))) |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
... а если realloc не сможет, то сделать всё те же самые действия, ага. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
C only Добавлено через 47 секунд Точнее он(realloc) сам их сделает, ага -------------------- 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 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
нет, он просто вернёт NULL, а делать это придётся самим. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
JackYF, наверное мы с тобой друг друга недопонимаем
-------------------- 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 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
тем, что он не обязан хранить элементы, как массив - то есть в этом случае std::vector чуть быстрее будет отдавать массив данных, чем c_str (в общем случае) + массив, вроде, обязан резервировать память именно для скорейшей вставки. про стринг такого не помню... жаль, что аффтары не указывают язык, на котором хотят получить ответ Добавлено через 1 минуту и 24 секунды Добавлено через 5 минут и 21 секунду и если язык - Си, то, думаю, самое большое быстродействие можно получить, если позаимствовать алгоритм вектора |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Для реаллока вернуть NULL - нормальная ситуация, если он не может расширить блок. Вдруг за блоком ещё один блок и расширять уже некуда. В этом случае надо сделать free, затем malloc. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
JackYF, вообще-то в документации к realloc не указано, что он может невыполниться из-за фрагментации памяти. На сколько мне известно, алгоритм его работы в этом случае аналогичен malloc()+memcpy()+free().
|
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
JackYF, если руководствоваться более достоверным источником(C99), то NULL будет возвращён в случае, если выделение памяти невозможно(т.е. руками тоже не получится).
-------------------- 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 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
archimed7592,
bsa, тогда вопрос. Почему тогда реализации того же std::vector не юзают, как правило, реаллок, раз он всё выполняет сам? З.Ы. Вообще хорошо провести бы тест. Если будет время, составлю маленькую тестовую программу. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Очевидно потому, что realloc может переместить объекты с одного места на другое, что для не-POD'ов недопустимо -------------------- 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 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |