我想在C ++中实现一个字符串比较,比较字符串到"%"登录。
我可以这样做:
std::equal(str1.begin(),
std::find(str1.begin(), str1.end(), L'%'),
str2.begin());
由于我在一个循环中执行了很多字符串,我想知道是否有一个方法没有find
和equal
的两个不同的字符串遍历(可能有一个可以中止的谓词任何时候的比较)。提升是可以的。
答案 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 […]
答案 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
足够长,但问题中的代码也是如此。