C ++将字符串比较为"%"烧焦

时间:2014-12-05 18:44:54

标签: c++ boost stl string-comparison

我想在C ++中实现一个字符串比较,比较字符串到"%"登录。

我可以这样做:

std::equal(str1.begin(), 
           std::find(str1.begin(), str1.end(), L'%'),
           str2.begin());

由于我在一个循环中执行了很多字符串,我想知道是否有一个方法没有findequal的两个不同的字符串遍历(可能有一个可以中止的谓词任何时候的比较)。提升是可以的。

2 个答案:

答案 0 :(得分:12)

您可以尝试std::mismatch
以下代码将与C ++ 14一起运行(它需要模板重载两个迭代器对),但它在C ++ 11(或03,没有lambdas)中非常相似:

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

Demo

答案 1 :(得分:2)

这是一种做法的黑客方式:

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足够长,但问题中的代码也是如此。