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 […]