C++ 检查排序列表中是否有一个范围内的数字

C++ 检查排序列表中是否有一个范围内的数字,c++,c++11,C++,C++11,假设我有一个排序数组L,我得到了一些数字I,j。是否有库函数用于检查L是否包含[i,j]范围内的数字?我知道这很容易通过类似二进制搜索的算法实现,但我更愿意避免它。它可以作为std::lower_bound: template<typename ForwardIt, typename T> bool has_in_range(ForwardIt first, ForwardIt last, const T& i, const T& j) { auto lb =

假设我有一个排序数组L,我得到了一些数字I,j。是否有库函数用于检查L是否包含[i,j]范围内的数字?我知道这很容易通过类似二进制搜索的算法实现,但我更愿意避免它。

它可以作为
std::lower_bound
:

template<typename ForwardIt, typename T>
bool has_in_range(ForwardIt first, ForwardIt last, const T& i, const T& j) {
    auto lb = std::lower_bound(first, last, i);
    return lb != last && !(j < *lb);
}
模板
bool在范围内(先转发,后转发,常数T&i,常数T&j){
auto lb=std::下限(第一个、最后一个、i);
返回磅数=最后一次和第二次(j<*lb);
}
在上面的代码中,我故意使用
操作符
std::vector myVec;

对于(int a=i;a使用二进制搜索通常是最有效的方法,但是如果您有特定的数据类型,您可能会找到更快的方法。例如,如果您的列表限制为0到63个数字,并且没有重复项,则可以使用位操作在位
i
j
之间形成掩码,然后将其使用存储在
uint64\u t
中的位的列表,这将非常快。在这种特定情况下,我将使用没有任何合理界限的整数,因此位掩码将浪费太多空间。您可能会问自己是否需要对列表进行排序。您是否经常进行此查询?如果不是,您可以检查未排序的liSt in o(n),而不是在O(n log n)中排序列表,然后对范围内的某个对象进行O(log n)搜索。排序后的<代码> STD::列表< /C> > C++列表没有二进制搜索,因为它们不提供随机访问。抱歉,我是说数组……当在数学和编程之间切换时需要使用正确的术语。
std::vector<int> myVec;
for( int a = i; a <= j; a++)
    myVec.push_back(a);

bool contains = std::any_of(l.begin(), l.end(), 
                            [&myVec] (int n) { if (std::find(myVec.begin(), myVec.end(), n) == myVec.end()) 
                                                   return false;
                                               return true;});