如何使用upper_bound找出满足特定条件的最后一个变量

问题描述

我正在尝试使用log(n)方法来找出满足特定条件的最后一个变量。我查看了文档,发现 这些在算法部分(http://www.cplusplus.com/reference/algorithm/

二进制搜索(对分区范围/排序范围进行操作):

lower_bound:将迭代器返回到下限(函数模板)

upper_bound:将迭代器返回到上限(函数模板)

equal_range:获取等值元素的子范围(功能模板)

binary_search:测试值是否按排序顺序(功能模板)存在

我想做我想做的事,应该使用upper_bound / lower_bound。

在这种情况下,我试图找出小于或等于3的数字的最后一个索引。(3)。我知道有更简单的方法,例如遍历整个数组,但是我想学习如何使用upper_bound。我知道比较器需要2个数字,但是我不需要2个数字,所以我不确定该怎么做。

#include <bits/stdc++.h>

using namespace std;
vector<int> a = {0,1,2,3,4,5};
bool check(int base) {
    if (a.at(base)  <= 3) {
        return true;
    }
    return false;
}

int main() {
    int c;
    sort(a.begin(),a.end());
    c = distance(a.begin(),upper_bound(a.begin(),a.end(),check));
    cout<<c;
    return 0;
}

我如何正确地做到这一点?

解决方法

比较器将您要搜索的3的数字与向量中的数字进行比较。这就是为什么它需要两个参数的原因。当您应该将数字3作为参数传递给upper_bound时,您已经在比较器中进行了硬编码。

这也是对向量进行排序的函数,因此,如果要使用向量,还应将其传递给sort

您的代码可能看起来像这样

bool check(int x,int y) {
    return x < y;
}

int main() {
    int c;
    sort(a.begin(),a.end(),check);
    c = distance(a.begin(),upper_bound(a.begin(),3,check));
}

但是由于在这种情况下check只是默认的小于操作,因此您可以完全省略它。

int main() {
    int c;
    sort(a.begin(),a.end());
    c = distance(a.begin(),3));
}

请参见参考文献here