Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как найти определенную позицию в длинной строке


Автор: Teran 25.7.2006, 18:49
есть код:
суть в чем я передаю саму строку и индекс с которого нужно получить "выходную строку"
сепаратором является например - #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мин)
как можно ускорить этот поиск
 

Автор: Matematik 25.7.2006, 19: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;


 

Автор: Akeem 25.7.2006, 20:29
Вот Код который еффективно работает со строкой:
Код

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



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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)