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

C++ 找出两个范围(其中一个已排序)是否具有公共元素,c++,c++11,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)); std::向量向量向量机; 性

我编写了以下代码:

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));
std::向量向量向量机;
性病:病媒分类;
// ...
布尔hasCommonElement=
标准::任何(开始(vec),结束(vec),
std::bind(std::binary_搜索,开始(sortedRange),结束(sortedRange),_1));
编译器抱怨说,它无法找出我所指的二进制搜索重载。你还有其他优雅的解决方案吗?还是它不编译的一个好理由

编辑

  • 我知道我可以用兰姆达。但是在这里绑定看起来更优雅(如果我有通用的lambdas,那就太好了!但我没有)
  • 我知道我可以限定迭代器类型:
    binary\u search
    。但它更不优雅
  • 我知道我也可以通过排序“vec”和使用set_交集来实现。但这也更复杂

您可以使用lambda而不是
绑定来执行此操作

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

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

#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;
}
#包括
#包括
#包括
int main({
std::vec;
性病:病媒分类;
布尔元素=
std::任何(
开始(vec),结束(vec),
绑定(
二进制搜索,
开始(分拣),
结束(分拣机),
std::占位符::1));
返回0;
}

我正在努力避免“污染”这一次,lambda似乎不那么优雅。但是,我似乎没有太多选择:/@Alex我不知道另一种方法是如何使用
std::bind
std::binary\u search
std::placeholder::\u 1
比这个方法更干净、更可读、更容易理解lambda。您可能希望提到多态lambda将消除拼写
x
的类型(
int
)的需要。如果
x
的类型发生变化,这将使此解决方案更安全。我确实限定了占位符..只是不在此代码示例中。将修复:)无论如何,在这种情况下,如果我需要直接指定迭代器类型,并且无法推导,那么lambda似乎会更优雅。