我有以下d语言代码用来替换字符串ref T replaceStringTauto ref T allStrauto ref T searchStrauto ref T replaceStr bool isCaseSensitive=trueifisSomeString!T long index = 0; while index = isCaseSensitive allStrinde
以下是一个可能更高效的实现:
ref T replaceString(T)(auto ref T allStr, auto ref T searchStr, auto ref T replaceStr, bool isCaseSensitive=true)
if(isSomeString!T)
{
if (searchStr.empty)
return allStr;
size_t startIndex = 0;
for (;;)
{
size_t index;
if (isCaseSensitive)
index = allStr.indexOf(searchStr, startIndex);
else
index = allStr.toLowerAll().indexOf(searchStr.toLowerAll(), startIndex);
if (index == size_t(-1))
break;
allStr = allStr[0 .. index] ~ replaceStr ~ allStr[index + searchStr.length .. $];
startIndex = index + replaceStr.length;
}
return allStr;
}
这个实现的主要优化在于:
- 搜索字符串为空时,直接返回原始字符串,避免不必要的循环
- 使用
size_t类型代替long类型,因为前者更适合索引和字符串长度等非负整数 - 使用
for (;;)循环代替while循环,因为前者可以更好地表示“一直循环直到条件不满足”的语义 - 将
index += replaceStr.length移动到循环体的最后,避免不必要的重复计算
不过需要注意的是,这个实现可能并不能完全解决性能问题,因为字符串替换是一个相对复杂的操作,实际性能还会受到其他因素的影响,比如字符串长度、替换字符串的长度、CPU 缓存等等。如果需要进一步优化,可能需要更深入地分析这些因素,或者考虑使用更高效的数据结构来存储和处理字符串
原文地址: https://www.cveoy.top/t/topic/fr6I 著作权归作者所有。请勿转载和采集!