Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как найти определенную позицию в длинной строке, при работе с строкой вешается комп 
:(
    Опции темы
Teran
  Дата 25.7.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

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



есть код:
суть в чем я передаю саму строку и индекс с которого нужно получить "выходную строку"
сепаратором является например - #BREAK#;
Код

AnsiString __fastcall GetItemPost(AnsiString ItemRet,int Item)
{int CountItem=0;
 while(ItemRet.Pos("#BREAK#")&&(CountItem<Item))
 {ItemRet=ItemRet.Delete(1,ItemRet.Pos("#BREAK#")+6);
  CountItem++;
  }
return ItemRet.Trim();
}

здесь я удаляю строку пока не дойду до нужной мне позиции но когда эта строка очень большая (загружаю файл размером 1.3мб) комп сильно медленно это делает (~3мин)
как можно ускорить этот поиск
 


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Matematik
Дата 25.7.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Тормозит функция delete. Сделай так чтобы вызывалась она только один раз.

Добавлено @ 19:52 
В с++ должен быть аналог PosEx из Delphi7

Код

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
  I,X: Integer;
  Len, LenSubStr: Integer;
begin
  if Offset = 1 then
    Result := Pos(SubStr, S)
  else
  begin
    I := Offset;
    LenSubStr := Length(SubStr);
    Len := Length(S) - LenSubStr + 1;
    while I <= Len do
    begin
      if S[I] = SubStr[1] then
      begin
        X := 1;
        while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
          Inc(X);
        if (X = LenSubStr) then
        begin
          Result := I;
          exit;
        end;
      end;
      Inc(I);
    end;
    Result := 0;
  end;
end;


 
PM MAIL WWW ICQ   Вверх
Akeem
Дата 25.7.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 14.7.2006
Где: Киев/Украина

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



Вот Код который еффективно работает со строкой:
Код

String str;
str="hgkhgdklfgskjfghsfjghkdjg#break#gjdlfkgjdflgdflgjkdflgj";
int pos=str.LastDelimiter("#break#");
str.Delete(1, pos);



Ну и так далее. при этом функция Delete вызывается один раз

Добавлено @ 20:30 
или можно преобразовывать с тип string и использовать метод erase() 


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
_hunter
Дата 26.7.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



а зачем, вообще, из строки что-то удалять?
формируй в функции новую строку (путем конкатенации подстрок) и возвращай ее 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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