C++ 演出查找子字符串。substr vs find
假设我们有一个字符串var“sA”,我想检查字符串“123”是否在sA的末尾 做什么更好以及为什么:C++ 演出查找子字符串。substr vs find,c++,string,performance,C++,String,Performance,假设我们有一个字符串var“sA”,我想检查字符串“123”是否在sA的末尾 做什么更好以及为什么: if(sA.length()>2)sA.substr(sA.length()-3)=“123” if(sA.length()>2)sA.find(“123”,sA.length()-3)!=字符串::NPO 提前感谢第二个代码片段避免了创建两个临时对象(一个用于转换为std::string的“123”,另一个用于substr的返回值),因此理论上它应该更快。然而,这种微观优化很少有回报:如果
if(sA.length()>2)sA.substr(sA.length()-3)=“123”
if(sA.length()>2)sA.find(“123”,sA.length()-3)!=字符串::NPO
提前感谢第二个代码片段避免了创建两个临时对象(一个用于转换为
std::string
的“123”
,另一个用于substr
的返回值),因此理论上它应该更快。然而,这种微观优化很少有回报:如果随机应用这种优化,那么使用第二种形式比第一种形式不太可能获得实质性的收益
当然,如果您的分析器告诉您,您的程序花费大量的时间检查字符串的结尾,情况就不同了;在这种情况下,优化可能会有所帮助。如果性能非常关键,我认为您不会比这更快(与其他方法相比,不需要分配):
const char needle[]=“abc”;
const char*干草堆;
const int len=strlen(干草堆);
如果(len此代码可能比您正在测试的代码快。
但是你只有做一些测试才能知道
bool EndsWith(const string &strValue, const string &strEnd)
{
int iDiference = strValue.size() - strEnd.size();
if(iDiference >= 0)
return (memcmp(strValue.c_str() + iDiference, strEnd.c_str(), strEnd.size()) == 0);
return false;
}
为什么不测试它呢?只需对这两个方法计时并进行比较。当然不是substr,如果你只想检查的话,你不需要创建子字符串。第二个版本的比较和字符串复制次数似乎最少……根据经验,我在这里一定不同意,因为如果你的大多数应用程序都在做这样的事情,它会产生真正的差异。其中一个进行分配,而另一个不进行分配,通常分配是非常昂贵的。如果应用程序大部分时间都用这种方式比较子字符串,这会产生明显的差异;因此我同意目前为止,这可能是一种微优化,在分析器显示有必要之前不应考虑。@PLasMah感谢你的注意。我澄清了答案,指出如果分析器告诉你,优化是值得的。如果OP声明他假设C++字符串为起点,那么这个速度还是更快吗?OP似乎只使用了STD::HOSTACK字符串。注意你可以复制。“代码> > conchch*HasDACK <代码> >代码> >代码> >代码> const int Le= StrLn(草垛)<代码> >代码> const int Le= Haistac .Lothe thh()/Case>代码仍然是有效的C++(具有相同的性能特征(只要<代码> STD::String::Trace[]/Cord<)在O(1)中运行)。特别是不需要拨款。
const char needle[] = "abc";
const std::string haystack;
const int len = haystack.length();
if (len<sizeof(needle))
return false;
for (int i=0; i<sizeof(needle); i++)
if (needle[i] != haystack[len-sizeof(needle)+i])
return false;
return true;
bool EndsWith(const string &strValue, const string &strEnd)
{
int iDiference = strValue.size() - strEnd.size();
if(iDiference >= 0)
return (memcmp(strValue.c_str() + iDiference, strEnd.c_str(), strEnd.size()) == 0);
return false;
}