假设我们有一个字符串var“sA”,我想检查字符串“123”是否在sA的末尾。
做什么更好,为什么:
if(sA.length() > 2) sA.substr(sA.length()-3) == "123"
if(sA.length() > 2) sA.find("123", sA.length() -3) != string::npos
提前致谢
答案 0 :(得分:4)
第二个代码片段避免创建两个临时对象(一个用于"123"
转换为std::string
,另一个用于substr
的返回值),所以理论上应该是快点。但是,这种微优化很少能够获得回报:如果你随机应用这种优化,你不太可能看到使用第二种形式而非第一种形式获得实质性收益。
当然,如果您的探查器告诉您程序花费大量时间来检查字符串的结尾,情况会有所不同;在这种情况下,优化可能会有所帮助。
答案 1 :(得分:2)
如果性能至关重要,我认为你不能比这更快(与其他方法相比,不需要分配):
const char needle[] = "abc";
const char *haystack;
const int len = strlen(haystack);
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;
显然,各种微观优化都是可能的,但这种方法是我能想到的最快的方法。
更多C ++ y版本,使用std :: string作为haystack:
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;
请注意,只要std::string::operator[]
为O(1),这两个列表就具有相同的性能特征
答案 2 :(得分:1)
此代码可能比您正在测试的代码更快。 但是你只会知道你是否做了一些测试。
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;
}