fre*_*ley 44 c++ prefix string-comparison
我有两个字符串,我想比较一下:String
和String:
.是否有一个库函数在传递这两个字符串时会返回true,但是对于say String
和OtherString
?
确切地说,我想知道一个字符串是否是另一个字符串的前缀.
Nim*_*Nim 50
使用std::mismatch
.传入较短的字符串作为第一个迭代器范围,将较长的字符串作为第二个迭代器范围传递.返回是一对迭代器,第一个是第一个范围中的迭代器,第二个是第二个范围内的迭代器.如果第一个是第一个范围的结尾,那么您知道短字符串是较长字符串的前缀,例如
std::string foo("foo");
std::string foobar("foobar");
auto res = std::mismatch(foo.begin(), foo.end(), foobar.begin());
if (res.first == foo.end())
{
// foo is a prefix of foobar.
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*nze 18
如果您知道哪个字符串更短,则过程很简单,只需先使用
std::equal
较短的字符串即可.如果不这样,以下内容应该起作用:
bool
unorderIsPrefix( std::string const& lhs, std::string const& rhs )
{
return std::equal(
lhs.begin(),
lhs.begin() + std::min( lhs.size(), rhs.size() ),
rhs.begin() );
}
Run Code Online (Sandbox Code Playgroud)
MSa*_*ers 15
std::string(X).find(Y)
当且仅当Y
是前缀时,该值为零X
RY_*_*eng 14
在C++20之后,我们可以使用starts_with来检查字符串是否以给定的前缀开头。
str.starts_with(prefix)
Run Code Online (Sandbox Code Playgroud)
另外,还有ends_with来检查后缀
Nei*_*hew 10
这既高效又方便:
str.compare(0, pre.size(), pre) == 0
Run Code Online (Sandbox Code Playgroud)
compare
之所以快,是因为它使用快速traits::compare
方法并且不必复制任何数据。
在这里,它将比较std::min(str.size(), pre.size())
字符,但是如果两个范围内的字符相等,则还将检查的长度,pre
如果pre
长度大于此值,则返回非零值。
请参阅cplusplus.com上的文档。
使用string :: compare,您应该可以编写如下内容:
bool match = (0==s1.compare(0, min(s1.length(), s2.length()), s2,0,min(s1.length(),s2.length())));
或者,如果我们不想使用length()
成员函数:
bool isPrefix(string const& s1, string const&s2)
{
const char*p = s1.c_str();
const char*q = s2.c_str();
while (*p&&*q)
if (*p++!=*q++)
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
如果您可以合理地忽略任何多字节编码(例如,UTF-8),那么您可以使用strncmp
:
// Yields true if the string 's' starts with the string 't'.
bool startsWith( const std::string &s, const std::string &t )
{
return strncmp( s.c_str(), t.c_str(), t.size() ) == 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您坚持使用花哨的C++版本,则可以使用该std::equal
算法(附加的好处是您的函数也适用于其他集合,而不仅仅是字符串):
// Yields true if the string 's' starts with the string 't'.
template <class T>
bool startsWith( const T &s, const T &t )
{
return s.size() >= t.size() &&
std::equal( t.begin(), t.end(), s.begin() );
}
Run Code Online (Sandbox Code Playgroud)
怎么样简单:
bool prefix(const std::string& a, const std::string& b) {
if (a.size() > b.size()) {
return a.substr(0,b.size()) == b;
}
else {
return b.substr(0,a.size()) == a;
}
}
Run Code Online (Sandbox Code Playgroud)
C++不是C,安全,简单,高效.
经测试:
#include <string>
#include <iostream>
bool prefix(const std::string& a, const std::string& b);
int main() {
const std::string t1 = "test";
const std::string t2 = "testing";
const std::string t3 = "hello";
const std::string t4 = "hello world";
std::cout << prefix(t1,t2) << "," << prefix(t2,t1) << std::endl;
std::cout << prefix(t3,t4) << "," << prefix(t4,t3) << std::endl;
std::cout << prefix(t1,t4) << "," << prefix(t4,t1) << std::endl;
std::cout << prefix(t1,t3) << "," << prefix(t3,t1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)