找出两个范围(其中一个是否已排序)具有共同元素

时间:2014-04-29 10:43:48

标签: c++ c++11

我编写了以下代码来执行此操作:

std::vector<int> vec;
std::vector<int> sortedRange;
// ...
bool hasCommonElement = 
    std::any_of(begin(vec), end(vec),
                std::bind(std::binary_search, begin(sortedRange), end(sortedRange), _1));

编译器抱怨它无法找出我所说的二进制搜索的重载。你还有其他优雅的解决方案吗?或者它没有编译的一个很好的理由?

修改

  • 我知道我可以使用lambda。但是这里的绑定似乎更优雅(如果我有通用的lambda,它会很棒!但我没有。)
  • 我知道我可以限定迭代器类型:binary_search<std::vector<int>::iterator>。但它更不优雅。
  • 我知道我也可以通过排序“vec”并使用set_intersection来实现。但这也更复杂。

2 个答案:

答案 0 :(得分:1)

您可以使用lambda而不是bind来执行此操作:

bool hasCommonElement = any_of(begin(vec), end(vec), [&](int x) {return binary_search(begin(sortedRange), end(sortedRange), x);});

答案 1 :(得分:1)

你有两个问题。 binary_search是一个模板(不推导出参数),您需要限定占位符:

#include <vector>
#include <algorithm>
#include <functional>

int main( {
    std::vector<int> vec;
    std::vector<int> sortedRange;
    bool hasCommonElement =
        std::any_of(
            begin(vec), end(vec),
            std::bind(
                std::binary_search<std::vector<int>::iterator, int>,
                begin(sortedRange),
                end(sortedRange),
                std::placeholders::_1));
    return 0;
}