C++;比较最大为";%的字符串&引用;烧焦 我想在C++中实现字符串比较,将字符串与“%”符号进行比较。
我可以这样做:C++;比较最大为";%的字符串&引用;烧焦 我想在C++中实现字符串比较,将字符串与“%”符号进行比较。,c++,boost,stl,string-comparison,C++,Boost,Stl,String Comparison,我可以这样做: std::equal(str1.begin(), std::find(str1.begin(), str1.end(), L'%'), str2.begin()); 由于我在许多字符串的循环中执行此操作,我想知道是否有一种方法没有对find和equal进行两次不同的字符串遍历(可能有一个谓词可以在任何时候中止比较)。Boost没问题。这里有一个简单的方法: auto it = std::find_if( str1.begin()
std::equal(str1.begin(),
std::find(str1.begin(), str1.end(), L'%'),
str2.begin());
由于我在许多字符串的循环中执行此操作,我想知道是否有一种方法没有对
find
和equal
进行两次不同的字符串遍历(可能有一个谓词可以在任何时候中止比较)。Boost没问题。这里有一个简单的方法:
auto it = std::find_if(
str1.begin(), str1.end(),
[&str2](const char &c) {
return c == '%' || str2[&c - &str1[0]] != c
}
);
bool equal = (it == str1.end() || *it == '%');
其思想是创建一个谓词“字符与另一个字符串中的字符相同,而不是'%'
”
它依赖于str2足够长,但问题中的代码也是如此。你可以试试以下代码将在C++14中运行(它需要带有两个迭代器对的模板重载),但在C++11(或03,但没有lambdas)中的工作方式非常类似:
.您能给出一些您正在比较的字符串的示例吗?对于浮动的输入字符串,至少有3种不同的解释。“当前卷是:\%1\”“vs.”当前卷是:\'C:\”“是
str1
总是包含%
,或者可以str2
拥有它,但不能str1
?@greatwolf在我的情况下,只有str1
会(可能)包含感兴趣的%
。很好!在C++03中,std::mismatch是一个额外的功能。
auto iters = std::mismatch( str1.begin(), str1.end(), str2.begin(), str2.end(),
[] (char lhs, char rhs) {return lhs != '%' && lhs == rhs;});
if (iters.first == str1.end()
|| iters.second == str2.end()
|| *iters.first == '%')
// Success […]