我需要检查std:string是否以“ xyz”开头。我该怎么做而不搜索整个字符串或使用substr()创建临时字符串。
Answers:
我会使用比较方法:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
可能更符合标准库精神的方法是定义您自己的begins_with算法。
#include <algorithm>
using namespace std;
template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
return input.size() >= match.size()
&& equal(match.begin(), match.end(), input.begin());
}
这为客户端代码提供了更简单的界面,并且与大多数标准库容器兼容。
查看Boost的String Algo库,该库具有许多有用的功能,例如starts_with,istart_with(不区分大小写)等。如果您只想在项目中使用Boost库的一部分,则可以使用bcp实用程序进行复制仅需要的文件
似乎std :: string :: starts_with在C ++ 20内,同时可以使用std :: string :: find
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
因为它可以轻松检查字符串是否以文字开头,而无需重复文字本身来查找其大小。并感谢您指出C ++ 20直接解决方案。
我觉得我不完全了解您的问题。看起来似乎不重要:
s[0]=='x' && s[1]=='y' && s[2]=='z'
这只会查看(最多)前三个字符。对于在编译时未知的字符串的一般化要求您将以上内容替换为循环:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
。