C++比较字符串直到"%"字符

8
我可以帮助你翻译有关IT技术的文本。以下是需要翻译的内容:

我想在C++中实现一个字符串比较,仅比较字符串中的“%”符号之前的部分。

可以按照以下方式实现:

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

由于我要在循环中处理许多字符串,我想知道是否有一种方法可以同时执行findequal而不必进行两次独立的字符串遍历(可能使用一个可以在任意点中止比较的谓词)。使用Boost库是可以的。


1
你能给一些你正在比较的字符串的例子吗?目前有至少3种不同的输入字符串解释。 - Bill Lynch
当前音量为: "%1" vs. 当前音量为: "C:" - Felix Dombek
“str1” 会一直包含 “%” 吗?还是只有 “str2” 可能有,而 “str1” 没有呢? - greatwolf
@greatwolf 在我的情况下,只有 str1 可能会包含感兴趣的 % - Felix Dombek
2个回答

12

你可以尝试std::mismatch


下面的代码将在C++14中运行(它需要模板重载,带有两个迭代器对),但它在C++11中也非常类似运行(或03,在没有lambda的情况下):

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


太好了!而且std::mismatch在C++03中也是一个额外的奖励。 - Felix Dombek

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接