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 минуты
Отредактировано 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
|
Может реализую завтра, а может и нет Если будет свободное время -- сделаю. |
|
Георгий |
Отправлено: 02.07.2005, 16:25 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
а std::deque не подойдёт? |
|
esh |
Отправлено: 03.07.2005, 00:29 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 71
|
Может и подойдет, но я уже написал
Там в .h файле есть небольшое описание, для работы необходимо бросить оба файла в папку с проектом
и написать #include "faststring.h"
Отредактировано esh — 03/07/2005, 01:00 |
|
esh |
Отправлено: 03.07.2005, 01:03 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 71
|
Вот сам файл
|
|
Георгий |
Отправлено: 03.07.2005, 13:24 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
а ещё у класса basic_string — базового для string есть метод reserve |
|
esh |
Отправлено: 04.07.2005, 00:22 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 71
|
И у меня есть
Только что-то автор не появляется... |
|