sma*_*ins 9 delphi delphi-2009 delphi-2010
有没有像PosEx这样的Delphi D2010函数,从字符串末尾开始在字符串中找到一个子字符串?
我正在删除对FastStrings库的所有调用,我使用的其中一个函数是FastPosBack:
function FastPosBack(const aSourceString, aFindString : AnsiString; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
Run Code Online (Sandbox Code Playgroud)
我找到了LastDelimiter,但它不是一回事,因为它只找到最后一个分隔符而我无法指定起始位置.
谢谢!
更新:在DR评论之后,我创建了这个函数:
function FastPosBack(const aSourceString, aFindString : String; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
var
RevSourceString, RevFindString: string;
begin
RevSourceString := AnsiReverseString(aSourceString);
RevFindString := AnsiReverseString(aFindString);
Result := Length(aSourceString) - PosEx(RevFindString, RevSourceString, StartPos) + 1;
end;
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法呢?在1000000循环周期中,Pos需要47ms而FastPosBack需要234ms才能完成.
试试这个/这些:
function RPos(const aSubStr, aString : String; const aStartPos: Integer): Integer; overload;
var
i: Integer;
pStr: PChar;
pSub: PChar;
begin
pSub := Pointer(aSubStr);
for i := aStartPos downto 1 do
begin
pStr := @(aString[i]);
if (pStr^ = pSub^) then
begin
if CompareMem(pSub, pStr, Length(aSubStr)) then
begin
result := i;
EXIT;
end;
end;
end;
result := 0;
end;
function RPos(const aSubStr, aString : String): Integer; overload;
begin
result := RPos(aSubStr, aString, Length(aString) - Length(aSubStr) + 1);
end;
Run Code Online (Sandbox Code Playgroud)
重载提供了一种使用最有效的startpos来调用RPos的方法,用于从字符串的最末端进行搜索,而无需自己计算.为了提高效率,在明确指定时不对startpos执行检查.
在我的SmokeTest性能测试套件中,它的速度比FastPosBack快20%(偶然包含"off by one"错误以及需要一些实际上没有使用的参数).
归档时间: |
|
查看次数: |
7430 次 |
最近记录: |