C++ 演出查找子字符串。substr vs find

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的返回值),因此理论上它应该更快。然而,这种微观优化很少有回报:如果

假设我们有一个字符串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
的返回值),因此理论上它应该更快。然而,这种微观优化很少有回报:如果随机应用这种优化,那么使用第二种形式比第一种形式不太可能获得实质性的收益


当然,如果您的分析器告诉您,您的程序花费大量的时间检查字符串的结尾,情况就不同了;在这种情况下,优化可能会有所帮助。

如果性能非常关键,我认为您不会比这更快(与其他方法相比,不需要分配):

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;
}