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

时间:2013-12-31 00:27:08

标签: c++ c++11

...鉴于

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,但这并不完全匹配。同上std :: equal。标准库中真的没有什么合适的吗?我想我可以自己编写(或使用一个普通的旧C风格循环,这是我做的但是多么无聊:-)但我认为我正在做的是相当普遍的,所以这将是一个奇怪的遗漏IMO。所以我的问题是我错过了什么?

3 个答案:

答案 0 :(得分:5)

是否有使用谓词与范围进行比较的标准算法?是的,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; });
  

但我认为我所做的是相当普遍的

不,不是真的。如果您只想在两个范围内的相应元素上运行常规函数,则相应的算法将为for_eachzip iterator。如果标准中缺少任何内容,则它是zip迭代器。我们不需要为此目的使用特殊算法。

答案 1 :(得分:3)

看起来好像在寻找std::mismatch(),它会产生迭代器,其中找到第一个差异(或者当然是结束)。但是,它不计算差异,因为没有为所有类型定义减法。与其他算法一样,std::mismatch()以带有谓词的形式和带有谓词的形式出现。

答案 2 :(得分:0)

谢谢所有回答。我试图做的事情(更多是为了我的启发而不是其他任何事情)是替换这个......

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

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

唯一的事情就是我会以与他们的名字不同的方式使用算法,这可能会导致未来的维护问题所以我现在只会坚持我无聊的旧循环,但我学会了新的东西,所以谢谢再一次。