是否有使用谓词比较两个范围的标准方法

Is there a standard way to compare two ranges using a predicate?

本文关键字:两个 范围 方法 标准 谓词 比较 是否      更新时间:2023-10-16

给定...

string a; // = something.
string b; // = something else.  The two strings are of equal length.
string::size_type score = 0;

。我想做的是这样的...

compare(a.cbegin(), a.cend(), b.cbegin(), b.cend(), [&score](const char c1, const char c2) -> void {
    if (c1 == c2) { // actually a bit more complicated in real life
        score++;
    }
});

。但据我所知,似乎没有 std::compare。 最近的似乎是std::lexicographical_compare但这并不完全匹配。 同上,标准::平等。 标准库中真的没有什么合适的吗? 我想我可以自己写(或者使用一个普通的旧 C 样式循环,这就是我所做的,但多么无聊:-)但我认为我正在做的事情很常见,所以这将是一个奇怪的遗漏 IMO。 所以我的问题是我错过了什么吗?

是否有标准算法可以与使用谓词的范围进行比较?是的,std::equalstd::lexicographical_compare.

是否有标准算法可以执行代码正在执行的操作? std::inner_product可以做到这一点:

std::string a = "something";
std::string b = "samething";
auto score = std::inner_product(
    a.begin(), a.end(), b.begin(), 0,
    [](int x, bool b) { return x + b; },
    [](char a, char b) { return a == b; });

但我认为我正在做的事情很常见

不,不是真的。如果您只想对两个范围内的相应元素运行通用函数,则使用zip迭代器for_each适当的算法。如果标准中缺少任何内容,那就是zip迭代器。为此,我们不需要特殊的算法。

看起来有点

像你在寻找std::mismatch()它会产生找到第一个差异(当然是结束)的迭代器。但是,它不会计算差异,因为没有为所有类型定义减法。像其他算法一样,std::mismatch()有谓词的形式,也有没有谓词的形式。

感谢所有回答的人。 我试图做的(更多的是为了我的启迪而不是其他任何事情)是取代这个......

for (string::const_iterator c1 = a.begin(), c2 = b.begin(); c1 != a.end(); ++c1, ++c2) {
    if (*c1 == *c2) {
        score++;
    }
}

。与时髦的新 C++11 的东西:-) 我看了相等、lexicographical_compare等,但我想让我绊倒的是他们采用布尔谓词,如果它返回错误处理停止,而我每次都需要处理整个范围。 然后,在阅读了您给我的答案后,我顿悟了,仅仅因为有返回值并不意味着如果我不需要它,我就不能扔掉它。 通过简单地在我的lambda中始终返回true,我可以使用上述任何算法,它们将运行到范围的末尾。

唯一的问题是,由于我将以与它们名称不同的方式使用这些算法,因此将来可能会导致维护问题,因此我现在只会坚持我无聊的旧循环,但我学到了一些新东西,所以再次感谢。