C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
строка и время ее инициализации
Guest
Отправлено: 01.07.2005, 12:28


Не зарегистрирован







Имеется строка, которой в цикле в конец добавляется несколько символов, проблема состоит в том, что когда эта строка становиться большой процесс добавления новых символов существенно замедляется, как это можно исправить ? если можно пример
CODE

AnsiString s=””;
For(int i=0;i<m;i++)
{
S+=F();
}



esh
Отправлено: 01.07.2005, 12:43


Дежурный стрелочник

Группа: Участник
Сообщений: 71



использовать char*
Admin
Отправлено: 01.07.2005, 12:46


Владимир

Группа: Администратор
Сообщений: 1190



Наверное, каждый раз при изменении строки(увеличении размера)
происходит выделение помяти на очередной символ.

Может лучше воспользоваться массивом типа char []
выделив сразу максимальное количество памяти,
или char* buf = new char[максим размер];
а по окончании формирования буфера присваивать его строке ?

CODE

char* buf = new char[максим размер];
for(int i=0;i<m;i++)
{
buf[i] =F();
}
AnsiString s = buf;
delete [] buf;


должно работать быстрее.

P.S. esh: Не успел на 3 минуты smile.gif

Отредактировано Admin — 01/07/2005, 12:47
Sl@Sh
Отправлено: 02.07.2005, 02:36


Мастер участка

Группа: Участник
Сообщений: 383



А что делает F() ? Она строку вашу случайно не использует ?
esh
Отправлено: 02.07.2005, 14:37


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Можно написать небольшой класс, данные в нем хранить в char*, память выделять
динамически (копать в сторону HeapReAlloc). Например, в начале выделяем 32К памяти,
пишем данные в строку с помощью оператора +=, который нужно перегрузить, проверяем,
есть ли свободное место в буфере и хватит ли его, если F() возвращает не char, а char*,
то нужно перегружать оператор += именно для char* и использовать strlen для определения
необходимого свободного места в буфере. Если места не хватает, нужно увеличить размер
выделенной памяти на 32К, если опять мало -- еще на 32К, только нужно предусмотреть
увеличение буфера на несколько блоков по 32К в пределах вызова одного оператора +=, т.к.
добавляемая строка может быть больше 32768 символов. Еще нужно разобраться с нулем в конце
строки. Можно или писать его каждый раз при добавлении, или обнулять весь выделенный блок.
Оператор = тоже перегружаем (он должен возвращать char*)
Хотя если функция F() возвращает char, то я бы сделал так:

CODE

char* buf = new char[m+1];
for(int i=0;i<m;i++)
{
buf[i] =F();
}
buf[m]=NULL;
AnsiString s = buf;
delete [] buf;


Решай сам.
esh
Отправлено: 02.07.2005, 15:04


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Может реализую завтра, а может и нет smile.gif Если будет свободное время -- сделаю.
Георгий
Отправлено: 02.07.2005, 16:25


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а std::deque не подойдёт?
esh
Отправлено: 03.07.2005, 00:29


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Может и подойдет, но я уже написал smile.gif
Там в .h файле есть небольшое описание, для работы необходимо бросить оба файла в папку с проектом
и написать #include "faststring.h"

Отредактировано esh — 03/07/2005, 01:00
esh
Отправлено: 03.07.2005, 01:03


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Вот сам файл

User Attached Image Скачать файл
TFastStringObject.zip


Георгий
Отправлено: 03.07.2005, 13:24


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а ещё у класса basic_string — базового для string есть метод reserve cool.gif
esh
Отправлено: 04.07.2005, 00:22


Дежурный стрелочник

Группа: Участник
Сообщений: 71



И у меня есть smile.gif
Только что-то автор не появляется...

Вернуться в Вопросы программирования в C++Builder